首先介绍一下DMA
敲黑板:用于高速搬运数据,还无需CPU干预。 因此在多通道采集模拟量是,我们可以建立一个数组,用于储存AD转换的数据。一旦ADC_DR寄存器里有了新的数据,就把新数据放在数组里。一会儿ADC_DR有了一个新的数据,就放在数组下一位。数组装满以后?根据需求来。我们设置的是循环模式,也就是再来一遍,覆盖之前的数据。
2. cubemx配置主要内容
ADC引脚配置
生成代码
main.c里边需添加的/
1、定义变量
/* USER CODE BEGIN 0 */
uint32_t IOUT_Value[300]={0};; //传递给DMA存放多通道采样值的数组
uint16_t i,j,buf=0;
int32_t adc1_aver_val[3] = {0};
float PM25,yanwu,xinlv; //保存多通道的平均采样值的数组 [1]号写入PM2.5 [2]号写入yanwu [3]号写入心率
/* USER CODE END 0 */
2、启动DMA
/* USER CODE BEGIN 2 */
/*启动定时器3中断*/
HAL_TIM_Base_Start_IT(&htim3);
/*启动DMA中断*/
HAL_ADC_Start_DMA(&hadc, (uint32_t*)&IOUT_Value, 300); //启动DMA转换
//HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);
//模块开机
// POWER_ON;
// HAL_Delay(1000);
// POWER_OFF;
printf("System Running\r\n");
/* USER CODE END 2 */
3、添加主函数
for(i=0;i<3;i++)
{
adc1_aver_val[i] = 0;
}
/* 在采样值数组中分别取出每个通道的采样值并求和 */
for(i=0;i<300;i++)
{
adc1_aver_val[0] += IOUT_Value[i++];
adc1_aver_val[1] += IOUT_Value[i++];
adc1_aver_val[2] += IOUT_Value[i++];
}
HAL_Delay(100);
/* 依次对每个通道采样值求平均值 */
for(i=0;i<3;i++)
{
adc1_aver_val[i] /=100;
}
for(i=0;i<3;i++)
{
printf("ADC1[%02d] 转换值 = %1.3f V 原始数据 = %04d\r\n",i,adc1_aver_val[i]*3.30f/4095,adc1_aver_val[i]);
}