2021-10-24

3 篇文章 0 订阅

之前也提及过,但是对于多通道的dma的adc代码一直没有说过,这次决定稍微总结一下

首先是实现了:

1.利用DMA实现ADC1的三通道读取,
2.取了20个采样点取平均,进行一个简单的均值滤波

先是cubemx的配置:

这里选取了ADC1的通道456,

这里需要注意的几个点是:

1.改成EOC在所有转化完成后置位,EOC标志位的意思就是说转化完成了,如果不选取连续转化模式的话,在EOC标志位置1的时候,就会停止转化,连续转化就是说自动清0

2. Rank里面的通道的顺序要自己排一遍,可能是乱的,比如我这里就是4,5,6

接下来是DMA的配置

 

这里需要注意两个点:

1.circular模式才能连续转化

2.选memory并且是选择half word,简单解释一下

就是说最后的数据存成多少位,如果选word就是32位,但是实际上我选的单片机片上adc只是12位的,也就是说多了其实也没用,不如就存为16位的,也就是half word,但是有一点值得注意,如果这里写的是half word在主函数里面也得小心,

 比如这里就是16位,如果不小心写成uint32,那它就会把低16位填满过后,再填高16位,(也有可能是先高再低)这样的话,数据处理的时候即比较麻烦,因为得自己把高低16位分开,一句话概括这里选half word 主函数就写uint16,这里写word,主函数就可以写uint32

/***参数的定义***/
//打印信息的标志位
#define adc_print_flag 1
/* USER CODE BEGIN PV */
char str[44];
volatile uint16_t AdcRes[60];//意思是这个参数是易变化的,编译器不要随便优化它
volatile long AdcRes_sum[3];//意思是这个参数是易变化的,编译器不要随便优化它
volatile float AdcRes_average[3];//意思是这个参数是易变化的,编译器不要随便优化它


/***主函数里面的代码***/
HAL_ADC_Start_DMA(&hadc1,(uint32_t* )AdcRes,60);
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		
//		sprintf(str,"chan4=%f,chan5=%f,chan6=%f,num=%d\n",(AdcRes[0]*3.3/4095),(AdcRes[1]*3.3/4095),(AdcRes[2]*3.3/4095),AdcRes[0]);
		

		/***计算表达式***/
		D_fit=D1*(1-ug/(2*u0-1.732*um));
		
/***均值滤波***/
		AdcRes_sum[0]=0;
		AdcRes_sum[1]=0;
		AdcRes_sum[2]=0;
		for(int i=0;i<20;i++)
		{
			AdcRes_sum[0]+=AdcRes[i*3];
			AdcRes_sum[1]+=AdcRes[i*3+1];
			AdcRes_sum[2]+=AdcRes[i*3+2];
		}
		AdcRes_average[0]=AdcRes_sum[0]/20*3.3/4096;
		AdcRes_average[1]=AdcRes_sum[1]/20*3.3/4096;
		AdcRes_average[2]=AdcRes_sum[2]/20*3.3/4096;
		//打印函数
		#if adc_print_flag
		sprintf(str,"channel4=%f\n",AdcRes_average[0]);
		printf(str);
		sprintf(str,"channel5=%f\n",AdcRes_average[1]);
		printf(str);
		sprintf(str,"channel6=%f\n",AdcRes_average[2]);
		printf(str);
		#endif

 这里顺便提一嘴,写成#if的形式有个好处,方便自己调试的时候打印串口信息,当实际测评或者实际要用的时候,可以直接宏定义的adc_print_flag置0,就可以不打印,这样可以节约资源

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值