初中生
最后登录1970-1-1
在线时间 小时
注册时间2023-5-26
|
# 前言
本文使用模拟端口采集摇杆模块的模拟量,摇杆模块有X轴和Y轴两个方向的输出,需要两路模拟端口,本文使用AN001和AN002。
# 1 硬件连接
下图为ADC引脚复用图,可以看到AN000\~AN010对应的引脚正好是P000\~P010。这个设计还是很不错了,杜绝了到处去找引脚的麻烦。
本文驱动摇杆模块使用的就是AN001和AN002。
为什么不用AN000呢?因为板载资源的电位器已经将P000占用了。
# 2 RASC配置
## 2.1 配置ADC通道
知道了引脚连接,现在开始配置模拟端口,首先选择需要使用的模拟端口,如下图。
注:AN003是为了给其他外设使用的,本文不需要使用。
## 2.2 ADC转换配置
配置ADC如下,添加ADC的stack:
配置使用AN001,AN002。
选择了连续模式,这样就不用每次都使用软件触发ADC转换了,只需要启动一次之后就会自动采集,减少CPU消耗。
注意:channel scan mask中需要将使用到的channel都勾选,用于在使用scan功能的时候自动转换选中通道,如下:
# 3 代码开发
下面包含了:
- 初始化 `R_ADC_Open`
- 启动SCAN扫描 `R_ADC_ScanCfg`
- 最后是开始转换 `R_ADC_ScanStart`,调用这个之后会自动开始转换,只需要读取转换结果即可,不需要每次读取之前再手动启动转换了。
- /*
- @hehung
- 2023-7-15
- email: 1398660197@qq.com
- wechat: hehung95
- reproduced and please indicate the source @hehung
- */
- // MQ5 - 可燃气体传感器,用来检测可燃气体,使用的是ADC获取空气中可燃气体浓度
- // P000 ADC0 CH0
- /*
- P001 - AN001 : Rocker X
- P002 - AN002 : Rocker Y
- */
- #include "hal_data.h"
- #include "app_adc.h"
- #define ROCKER_DEBUG
- //#undef ROCKER_DEBUG
- #ifdef ROCKER_DEBUG
- #include <stdio.h>
- #define ROCKER_LOG(fmt, ...) printf(fmt, ##__VA_ARGS__)
- #else
- #define ROCKER_LOG(fmt, ...)
- #endif
- #define ADC_ROCKER_X_CHANNEL (1U)
- #define ADC_ROCKER_Y_CHANNEL (2U)
- #define ADC_MQ5_CHANNEL (3U)
- /*************************************************************************************************/
- /************************************** Rocker ***************************************************/
- /*************************************************************************************************/
- // Read conversion result
- void Rocker_RunningEntry(void)
- {
- fsp_err_t err = FSP_SUCCESS;
- uint16_t adc_value;
- err = R_ADC_Read(&g_adc0_ctrl, ADC_ROCKER_X_CHANNEL, &adc_value);
- if (FSP_SUCCESS == err)
- {
- ROCKER_LOG ("Rocker: Read value: %d: %d\r\n", ADC_ROCKER_X_CHANNEL, adc_value);
- }
- else
- {
- ROCKER_LOG ("Rocker: Read Rocker Data Error\r\n");
- }
- err = R_ADC_Read(&g_adc0_ctrl, ADC_ROCKER_Y_CHANNEL, &adc_value);
- if (FSP_SUCCESS == err)
- {
- ROCKER_LOG ("Rocker: Read value: %d: %d\r\n", ADC_ROCKER_Y_CHANNEL, adc_value);
- }
- else
- {
- ROCKER_LOG ("Rocker: Read Rocker Data Error\r\n");
- }
- }
- /*************************************************************************************************/
- /************************************** ADC ******************************************************/
- /*************************************************************************************************/
- // Initialize the MQ5 - ADC0 CH0 P000
- void Adc_Init(void)
- {
- fsp_err_t err = FSP_SUCCESS;
- /* Initializes the adc. */
- err = R_ADC_Open(&g_adc0_ctrl, &g_adc0_cfg);
- /* Handle any errors. This function should be defined by the user. */
- assert(FSP_SUCCESS == err);
- /* Enable channels. */
- err = R_ADC_ScanCfg(&g_adc0_ctrl, &g_adc0_channel_cfg);
- assert(FSP_SUCCESS == err);
- /* Enable scan triggering from ELC events. */
- (void)R_ADC_ScanStart(&g_adc0_ctrl);
- }
复制代码
# 4 试验效果
如下图所示,能成功采集到遥感模块的偏移量,后期可以使用遥感模块要控制OLED显示了。
|
|