文章目录
目标:通过串口打印ADC的值。
- RT-Thread studio,版本: 2.2.6,不一样其实区别也不大
- RT-Thread:标准版,4.0.3版本
- 芯片包版本:0.1.9
1. ADC测试
第一步:在 RT-Thread Settings 中 -> 组件 -> 设备驱动程序 -> 使用ADC设备驱动程序,勾选上。ctrl + s
保存。
第二步:在board.h
中打开#define BSP_USING_ADC1
宏定义。
这里测试使用的引脚为PA1(ADC1的通道1)。根据自己使用的ADC选择打开ADC几。
第三步:从左侧窗口打开cubemx,勾选上ADC1的CH1,确认一下引脚是不是对的,参数配置可以不用管。ADC打开了,时钟树配置界面ADC的时钟也要配置一下,不能超过14Mhz(ADC的需求)。然后关闭cubemx界面,生成代码后刷新左侧目录界面。即可在cubemx文件夹中的stm32f1xx_hal_msp.c
文件中看到ADC的引脚初始化代码。
此时如果直接编译,然后在Shell窗口输入list_device命令,就已经能看到adc1设备了。
第四步:编写测试代码,程序运行后,在Shell窗口输入adc_vol_test命令,即可以在Shell窗口看到连续发送50次的ADC采样值和电压值。在此过程中改变PA1接触的地方,可以看到电压值的改变。
/*
* 程序清单: ADC 设备使用例程
* 例程导出了 adc_vol_test 命令到控制终端
* 命令调用格式:adc_vol_test
* 程序功能:通过 ADC 设备采样电压值并转换为数值。
* 示例代码参考电压为3.3V,转换位数为12位。
*/
#include <rtthread.h>
#include <rtdevice.h>
#define ADC_DEV_NAME "adc1" /* ADC 设备名称 */
#define ADC_DEV_CHANNEL 1 /* ADC 通道 */
#define REFER_VOLTAGE 330 /* 参考电压 3.3V,数据精度乘以100保留2位小数*/
#define CONVERT_BITS (1 << 12) /* 转换位数为12位 */
static int adc_vol_test(int argc, char *argv[])
{
rt_adc_device_t adc_dev;
rt_uint32_t value, vol;
rt_err_t ret = RT_EOK;
/* 查找设备 */
adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME);
if (adc_dev == RT_NULL)
{
rt_kprintf("adc test run failed! can't find %s device!\n", ADC_DEV_NAME);
return RT_ERROR;
}
/* 使能设备 */
ret = rt_adc_enable(adc_dev, ADC_DEV_CHANNEL);
// 连续采集并发送50次
for(rt_uint16_t times = 0; times <= 50; times++)
{
/* 读取采样值 */
value = rt_adc_read(adc_dev, ADC_DEV_CHANNEL);
/* 转换为对应电压值 */
vol = value * REFER_VOLTAGE / CONVERT_BITS;
// 输出
rt_kprintf("the value is :%d, the voltage is :%d.%02d \n", value, vol / 100, vol % 100);
// 等待一下下再开启下一轮
rt_thread_mdelay(500);
}
/* 关闭通道 */
ret = rt_adc_disable(adc_dev, ADC_DEV_CHANNEL);
return ret;
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(adc_vol_test, adc voltage convert test);