STM32 使用ADC中断(非DMA)读取传感器数据
这里使用STM32F103C8T6开发板和灰度传感器测试STM32的ADC功能。软件上使用CubeMax快速生成相应代码,在ADC中断中读取传感器数值
灰度传感器
这里使用的是这种灰度传感器,接线简单,除了供电只需要将OUT引脚接到STM32的ADC引脚即可。如果模块的白灯效果不好,还可以把灯拆下来,换成别的LED。
CubeMax ADC配置
Number Of Conversion中,使用了多少路ADC就选择多少
Rank中的Channel不要选重复,周期越长测得越准
时钟树中,如果STM32主频配成了72MHz,那么ADC最快只能有12MHz,但F103C8T6的ADC最高频率为14MHz,想要追求极致的ADC采样速度就要降低STM32的主频在配置ADC分频系数像这样
根据实际情况取舍就好
STM32 代码编写
g_sensor.c
#include "g_sensor.h"
/**********************
* 7.13基地材料柜左侧地图
* g1 g2 g3
* 白 3500 3720 3610
* 红 3340 3600 3410
* **********************/
uint16_t g_sensor_value[3] = {
0};//保存灰度传感器读取的模拟值
uint16_t g_sensor_value_new[3] = {
0};//保存灰度传感器读取的模拟值
uint8_t alpha = 0.1;//一阶惯性滤波参数
uint16_t gs_white_standar[3] = {
0};//保存标定白色得到的值
uint16_t gs_red_standar[3] = {
0};//保存标定红色得到的值
uint8_t gs_1_check = 0,gs_2_check = 0,gs_3_check = 0;//保存传感器是否识别到红线
/***********************************
* 功能:ADC灰度传感器传输初始化
* 输入:无
* 返回:无
* **********************************/
void ADC_Init(void)
{
HAL_ADCEx_Calibration_Start(&hadc1);//ADC校准
}
/***********************************
* 功能:进行一次ADC灰度传感器数值读取
* 输入:无
* 返回:无
* *****************************