怎样实现ADCstm32 adc 连续转换换

STM32多通道ADC规则转换实现 - ARM单片机 - 电子工程世界网
STM32多通道ADC规则转换实现
11:51:12来源: eefocus
vu16 ADC_RCVTab[160] ;&&&//自己添加
int main(void)
#ifdef DEBUG
&&debug();
&&RCC_Configuration();
&&NVIC_Configuration();
&&GPIO_Configuration();
&&LcdShow_Init();
&&RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//使能DMA时钟
&&DMA_DeInit(DMA1_Channel1);
&&DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_A//外设地址
&&DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_RCVT//内存地址
&&DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//dma传输方向单向
&&DMA_InitStructure.DMA_BufferSize =&160;//设置DMA在传输时缓冲区的长度 word
&&DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_D//设置DMA的外设递增模式,一个外设
&&DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_E//设置DMA的内存递增模式,
&&DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfW//外设数据字长
&&DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfW//内存数据字长
&&DMA_InitStructure.DMA_Mode = DMA_Mode_C//设置DMA的传输模式:连续不断的循环模式
&&DMA_InitStructure.DMA_Priority = DMA_Priority_H//设置DMA的优先级别
&&DMA_InitStructure.DMA_M2M = DMA_M2M_D//设置DMA的2个memory中的变量互相访问
&&DMA_Init(DMA1_Channel1, &DMA_InitStructure);
&&DMA_Cmd(DMA1_Channel1, ENABLE);
&&ADC_InitStructure.ADC_Mode = ADC_Mode_I//独立工作模式
&&ADC_InitStructure.ADC_ScanConvMode = ENABLE;//扫描方式
&&ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//连续转换
&&ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_N//外部触发禁止
&&ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_R//数据右对齐
&&ADC_InitStructure.ADC_NbrOfChannel = 8;//用于转换的通道数
&&ADC_Init(ADC1, &ADC_InitStructure);
&&ADC_RegularChannelConfig(ADC1, ADC_Channel_8 , 1, ADC_SampleTime_239Cycles5);
&&ADC_RegularChannelConfig(ADC1, ADC_Channel_9 , 2, ADC_SampleTime_239Cycles5);
&&ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 3, ADC_SampleTime_239Cycles5);
&&ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 4, ADC_SampleTime_239Cycles5);&&
&&ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 5, ADC_SampleTime_239Cycles5);
&&ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 6, ADC_SampleTime_239Cycles5);
&&ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 7, ADC_SampleTime_239Cycles5);
&&ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 8, ADC_SampleTime_239Cycles5);&
&&ADC_DMACmd(ADC1, ENABLE);
&&ADC_Cmd(ADC1, ENABLE);&
&&ADC_ResetCalibration(ADC1);
&&while(ADC_GetResetCalibrationStatus(ADC1));
&&ADC_StartCalibration(ADC1);
&&while(ADC_GetCalibrationStatus(ADC1));
&&ADC_SoftwareStartConvCmd(ADC1, ENABLE);
&&while(RESET==DMA_GetFlagStatus(DMA1_FLAG_TC1));&&&//自己添加
&&&&while(1)
&&&&vu16 value1 = 0;
&&&&vu16 value2 = 0;&
&&&&vu16 value3 = 0;
&&&&vu16 value4 = 0;
&&&&vu16 value5 = 0;&
&&&&vu16 value6 = 0;&
&&&&vu16 value7 = 0;&
&&&&vu16 value8 = 0;
&value1 = average(ADC_RCVTab,0);
&value2 = average(ADC_RCVTab,1);&
&value3 = average(ADC_RCVTab,2);
&value4 = average(ADC_RCVTab,3);
&value5 = average(ADC_RCVTab,4);
&value6 = average(ADC_RCVTab,5);&
&value7 = average(ADC_RCVTab,6);
&value8 = average(ADC_RCVTab,7);&
&&&&u8 num1 = value3 % 10;
&&&&u8 num2 = (value3 / 10) % 10;
&&&&u8 num3= (value3 / 100) % 10;
&&&&u8 num4 = value3 / 1000;
&&&&if (num1 > 9)
&&&&&&display[3] = num1 + (65 - 10);
&&&&&&display[3] = num1 + (48-0);
&&&&if (num2 > 9)
&&&&&&display[2] = num2 +(65 - 10);
&&&&&&display[2] = num2 + (48 - 0);
&&&&if (num3>9)
&&&&&&display[1]=num3+(65-10);
&&&&&&display[1]=num3+(48-0);
&&&&if (num4>9)
&&&&&&display[0]=num4+(65-10);
&&&&&&display[0]=num4+(48-0);
&&&&write_string(display);
&&&&delay();
u16 average(vu16 ADCDataTab[], u16 nChannel)&&&&&//自己添加
&&&u16 averagevalue=0, maxvalue=0, minvalue=0xFFFF,
&&&for (i=0;i<20;i++)&
&&&&&averagevalue += *(ADCDataTab+nChannel+i*8);
&&if(*(ADCDataTab+nChannel+i*8)>maxvalue)&&&
&&maxvalue=*(ADCDataTab+nChannel+i*8);
&&if(*(ADCDataTab+nChannel+i*8)<minvalue)
&&minvalue=*(ADCDataTab+nChannel+i*8);
&return ((averagevalue-maxvalue-minvalue)/18);&&&//这样会耗时不可取 最好用 >>
关键字:&&&&
编辑:什么鱼 引用地址:
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。
微信扫一扫加关注 论坛活动 E手掌握
微信扫一扫加关注
芯片资讯 锐利解读
大学堂最新课程
汇总了TI汽车信息娱乐系统方案、优质音频解决方案、汽车娱乐系统和仪表盘参考设计相关的文档、视频等资源
热门资源推荐
频道白皮书
何立民专栏
北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。21ic官方微信-->
后使用快捷导航没有帐号?
ST MCU Finder
安装免费手机应用,
寻找理想的ST MCU
请完成以下验证码
查看: 203|回复: 5
关于stm32 ADC 连续转换的问题
&&已结帖(0)
主题帖子积分
助理工程师, 积分 1816, 距离下一级还需 184 积分
助理工程师, 积分 1816, 距离下一级还需 184 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
助理工程师, 积分 1816, 距离下一级还需 184 积分
助理工程师, 积分 1816, 距离下一级还需 184 积分
让stm32连续转换某个通道,通过DMA存到一个AD[32]的数组里面,连续存 先进先出模式 FIFO,需要的时候,再将所有的数组累加并除以32(移位),有人做个类似的程序吗?能分享过来参考参考吗?
主题帖子积分
助理工程师, 积分 1949, 距离下一级还需 51 积分
助理工程师, 积分 1949, 距离下一级还需 51 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
助理工程师, 积分 1949, 距离下一级还需 51 积分
助理工程师, 积分 1949, 距离下一级还需 51 积分
ADC转换的值又不是不定长的 需要FIFO来干嘛?
ADC连续转换,加了ADC中断没有?
主题帖子积分
助理工程师, 积分 1543, 距离下一级还需 457 积分
助理工程师, 积分 1543, 距离下一级还需 457 积分
主题帖子积分
专家等级:结帖率:100%打赏:0.00受赏:10.00
主题帖子积分
助理工程师, 积分 1543, 距离下一级还需 457 积分
助理工程师, 积分 1543, 距离下一级还需 457 积分
DMA只做数据转存这一块,速度快不占CPU时间,所以做好DMA的配置就行,到时候该怎么用这个数据那都是后话
主题帖子积分
助理工程师, 积分 1482, 距离下一级还需 518 积分
助理工程师, 积分 1482, 距离下一级还需 518 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
助理工程师, 积分 1482, 距离下一级还需 518 积分
助理工程师, 积分 1482, 距离下一级还需 518 积分
dma处理不了数据,只能完成存放的操作,也没有什么fifo,根据dma指针就知道当前数据在哪儿了
主题帖子积分
助理工程师, 积分 1458, 距离下一级还需 542 积分
助理工程师, 积分 1458, 距离下一级还需 542 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
助理工程师, 积分 1458, 距离下一级还需 542 积分
助理工程师, 积分 1458, 距离下一级还需 542 积分
ADC任务如果实时性不高。你大可以把ADC做成软件触发加中断,单次模式。你再用个变量,计数变成多次可控的采样。做那么平滑之类的..... stm32的ADC相较于其他单片机做的还是挺好的,
主题帖子积分
初级工程师, 积分 2117, 距离下一级还需 883 积分
初级工程师, 积分 2117, 距离下一级还需 883 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
初级工程师, 积分 2117, 距离下一级还需 883 积分
初级工程师, 积分 2117, 距离下一级还需 883 积分
如果你ADC有个阈值电压,需要实时的做出反应,而软件触发的方式不是实时的,很难及时的更正,那就把ADC配置成看门狗模式21ic官方微信-->
后使用快捷导航没有帐号?
ST MCU Finder
安装免费手机应用,
寻找理想的ST MCU
请完成以下验证码
查看: 2030|回复: 7
求助ADC的连续转换模式
&&未结帖(20)
主题帖子积分
初级技术员, 积分 78, 距离下一级还需 22 积分
初级技术员, 积分 78, 距离下一级还需 22 积分
主题帖子积分
专家等级:结帖率:36%
主题帖子积分
初级技术员, 积分 78, 距离下一级还需 22 积分
初级技术员, 积分 78, 距离下一级还需 22 积分
想用连续扫描模式的注入通道对一组输入信号进行实时的检测,可是我发现当我把ADC配置成扫描模式和连续模式时,扫描模式有作用而连续模式起不到作用。下面是我的ADC初始化代码
主题帖子积分
初级技术员, 积分 78, 距离下一级还需 22 积分
初级技术员, 积分 78, 距离下一级还需 22 积分
主题帖子积分
专家等级:结帖率:36%
主题帖子积分
初级技术员, 积分 78, 距离下一级还需 22 积分
初级技术员, 积分 78, 距离下一级还需 22 积分
void Adc1_Init(void)
{& &
& & & & //先初始化IO口
& & & & RCC-&APB2ENR|=1&&2;& & //使能PORTA口时钟
& & & & RCC-&APB2ENR|=1&&3;& & & & & & & & //使能PORTB时钟
& & & & GPIOA-&CRL&=0X0000FFFF;//PA4、5、6 、7 模拟输入
& & & & GPIOB-&CRL&=0XFFFFFFF0;//PB0模拟输入
& & & &&&
& & & & RCC-&APB2ENR|=1&&9;& & //ADC1时钟使能& & & && &
& & & & RCC-&APB2RSTR|=1&&9;& &//ADC1复位
& & & & RCC-&APB2RSTR&=~(1&&9);//复位结束& & & && &&&
& & & & RCC-&CFGR&=~(3&&14);& &//分频因子清零(2分频)& & & &
& & & & //SYSCLK/DIV2=8M ADC时钟设置为8M,ADC最大时钟不能超过14M!
& & & & //否则将导致ADC准确度下降! (8MHZ)
& & & & ADC1-&CR1&=0XF0FFFF;& &//工作模式清零
& & & & ADC1-&CR1|=0&&16;& && &//选择工作模式为独立工作模式
& & & && &
& & & & ADC1-&CR1|=1&&8;& & & & & & //扫描模式& & & && &
& & & & ADC1-&CR2|=1&&1;& & & & & & //连续模式
& & & & ADC1-&CR1|=1&&7;& && &//允许产生JEOC中断
//& & & & ADC1-&CR1|=1&&5;& && &//允许产生EOC中断
& & & & ADC1-&CR2|=1&&23;& & & && & //起用温度传感器
& & & && &
& & & & ADC1-&CR2&=~(7&&17);& & & && &
& & & & ADC1-&CR2|=7&&17;& & & && & //软件控制转换&&
& & & & ADC1-&CR2|=1&&20;& && &//使用用外部触发(SWSTART)!!!& & & & 必须使用一个事件来触发
& & & & ADC1-&CR2&=~(7&&12);& & & && &
& & & & ADC1-&CR2|=7&&12;& & & && & //软件控制转换&&
& & & & ADC1-&CR2|=1&&15;& && &//使用用外部触发(SWSTART)!!!& & & & 必须使用一个事件来触发
& & & & ADC1-&CR2&=~(1&&11);& &//右对齐
& & & & ADC1-&JSQR&=~(0XF&&20);
& & & & ADC1-&JSQR|=3&&20;& &&&//4个转换在注入序列中
& & & & ADC1-&JSQR&=0XFFF00000;//
& & & & ADC1-&JSQR|=4&&0;& & & && & //4号通道&&待定
& & & & ADC1-&JSQR|=7&&5;& & & && & //7号通道&&24V& & & &
& & & & ADC1-&JSQR|=8&&10;& & & && & //8号通道&&12v
& & & & ADC1-&JSQR|=16&&15;& & & && & //16号通道 温度& & & & & & & &&&
& & & & & & & && &
& & & & //设置通道的采样时间
& & & & ADC1-&SMPR2&=0XF8000FFF;//通道4,5,6,7,8采样时间清空
& & & & ADC1-&SMPR2|=7&&12;& && &//通道4&&239.5周期,提高采样时间可以提高精确度& & & & & & & &&&
& & & & ADC1-&SMPR2|=7&&21;& && &//通道7&&239.5周期,提高采样时间可以提高精确度& & & &&&
& & & & ADC1-&SMPR2|=7&&24;& && &//通道8&&239.5周期,提高采样时间可以提高精确度
& & & & ADC1-&SMPR1&=0XE4FFFF;& & & &&&//通道16采样时间清空
& & & & ADC1-&SMPR1|=7&&18;& & & & & & & &&&//通道16&&239.5周期,提高采样时间可以提高精确度
& & & & ADC1-&CR2|=1&&0;& & & && &&&//开启AD转换器& & & &&&
& & & & ADC1-&CR2|=1&&3;& && &&&//使能复位校准&&
& & & & while(ADC1-&CR2&1&&3);&&//等待复位结束 & & & & & & & & & & & &&&
& & //该位由软件设置并由硬件清除。在校准寄存器被初始化后该位将被清除。 & & & & & & & &&&
& & & & ADC1-&CR2|=1&&2;& && &&&//开启AD校准& & & && &
& & & & while(ADC1-&CR2&1&&2);&&//等待校准结束
& & & & //该位由软件设置以开始校准,并在校准结束时由硬件清除
& & & & MY_NVIC_Init(0,0,ADC1_2_IRQChannel,2);& & & & & & & &&&//ADC中断,最高优先级 组2
& & & & ADC1-&CR2|=1&&21;& && & //启动注入转换通道
}复制代码
主题帖子积分
初级技术员, 积分 78, 距离下一级还需 22 积分
初级技术员, 积分 78, 距离下一级还需 22 积分
主题帖子积分
专家等级:结帖率:36%
主题帖子积分
初级技术员, 积分 78, 距离下一级还需 22 积分
初级技术员, 积分 78, 距离下一级还需 22 积分
这是我的中断服务函数,如果加入一句代码则ADC工作正常,否则只产生一次ADC转换void ADC_IRQHandler(void)
{& & & &
& & & & if(ADC1-&SR&(1&&2))& & & & & & & & & & & & //ADC1 发生JEOC中断
& & & & {& & & &
& & & & & & & & ADC1-&SR&=~(1&&2);& & & & & & & & //清除中断标志位
& && && && && & ADC1-&CR2|=1&&21;& && && && &&&//不加入该句则ADC只产生一次转换
& & & & }
}复制代码
主题帖子积分
初级技术员, 积分 78, 距离下一级还需 22 积分
初级技术员, 积分 78, 距离下一级还需 22 积分
主题帖子积分
专家等级:结帖率:36%
主题帖子积分
初级技术员, 积分 78, 距离下一级还需 22 积分
初级技术员, 积分 78, 距离下一级还需 22 积分
顶一下,有同样遇到过这个问题的朋友或者大神帮我看下嘛,谢谢
主题帖子积分
初级技术员, 积分 78, 距离下一级还需 22 积分
初级技术员, 积分 78, 距离下一级还需 22 积分
主题帖子积分
专家等级:结帖率:36%
主题帖子积分
初级技术员, 积分 78, 距离下一级还需 22 积分
初级技术员, 积分 78, 距离下一级还需 22 积分
再顶下,都没人遇到过相似的问题么
主题帖子积分
助理工程师, 积分 1483, 距离下一级还需 517 积分
助理工程师, 积分 1483, 距离下一级还需 517 积分
主题帖子积分
专家等级:结帖率:93%
主题帖子积分
助理工程师, 积分 1483, 距离下一级还需 517 积分
助理工程师, 积分 1483, 距离下一级还需 517 积分
我也发现有这样的奇怪问题. 跟数据手册的说法有差异
另外, 对于楼主的程序, 虽然寄存器操作的执行代码很精炼, 但是看明白它还是有点累人
就加个中断服务吧.
这里, 只能你适应它了
主题帖子积分
初级技术员, 积分 78, 距离下一级还需 22 积分
初级技术员, 积分 78, 距离下一级还需 22 积分
主题帖子积分
专家等级:结帖率:36%
主题帖子积分
初级技术员, 积分 78, 距离下一级还需 22 积分
初级技术员, 积分 78, 距离下一级还需 22 积分
我发现连续模式似乎只对规则通道起作用,而在手册里的描述是这样的:
在连续转换模式中,当前面ADC 转换一结束马上就启动另一次转换。此模式可通
过外部触发启动或通过设置ADC_CR2 寄存器上的ADON 位启动,此时CONT
每个转换后:
● 如果一个规则通道被转换:
- 转换数据被储存在 16 位的ADC_DR 寄存器中
- EOC(转换结束)标志被设置
- 如果设置了 EOCIE,则产生中断。
● 如果一个注入通道被转换:
- 转换数据被储存在 16 位的ADC_DRJ1 寄存器中
- JEOC(注入转换结束)标志被设置
- 如果设置了 JEOCIE 位,则产生中断。
似乎其上的意思是对注入规则通道都应该有效的
主题帖子积分
---------------------
主题帖子积分
---------------------
专家等级:结帖率:96%打赏:0.00受赏:58.00
主题帖子积分
---------------------
最近我的测试, 这个问题在 F3 上还是存在.
真让人郁闷着呢.
欢迎进入 !
社区建设奖章
等级类勋章
欢快之小溪
发帖类勋章
时间类勋章
技术导师奖章
人才类勋章
荣誉元老奖章
等级类勋章
坚毅之洋流
发帖类勋章
技术领袖奖章
人才类勋章查看: 1541|回复: 2
stm32f411 adc 连续转换模式的疑问
主题帖子精华
初级会员, 积分 94, 距离下一级还需 106 积分
在线时间0 小时
&&&&& & 小弟最近在搞STM32F411的内部ADC,已经实现单通道的单次转换(规则通道),想实验一下单通道的连续转换模式(规则通道),查看手册得的11.3.5节,手册上说在CONT位为1时,可以通过外部触发或将ADC_CR2寄存器的SWSTRT位置1来启动连续转换模式(仅适用于规则通道),后参看ADC_CR2寄存器并未发现有SWSTRT位,只有SWSTART位,这是什么情况?麻烦知道的请告知一下?谢谢!
fe607ae0b_289.jpg (0 Bytes, 下载次数: 32)
22:54 上传
f2fde3af16dbb9.jpg (0 Bytes, 下载次数: 49)
22:54 上传
主题帖子精华
初级会员, 积分 65, 距离下一级还需 135 积分
在线时间2 小时
应该该是同一个,有时候文档脑残。。。经常出现错误。。。你可以先写进去调试仿真下啊。。
主题帖子精华
初级会员, 积分 124, 距离下一级还需 76 积分
在线时间20 小时
现在搞不定STM32F411的ADC单次转换,楼主方便发一下 STM32F411 的ADC工程吗?
Powered by随笔 - 55&
文章 - 0&评论 - 8&trackbacks - 0
上一篇文章讲述的内容是:三通道逐次转换(单次、单通道软件触发),也就是说3条通道要三次软件触发才能完成转换,而且是通过软件读取转换数值。
本文讲述三通道DMA连续转换(3通道、软件单次触发),也就是说3条通道只需要一次软件触发就能完成转换,使用DMA保存在数值。
上一篇文章实例是使用间断模式单次触发单条通道采集,本文是使用DMA模式单次触发三条通道采集。使用DMA传输的好处就是效率很高,我们直接读取转换的结果就是了,比如想做的示波器实例就是要求效率很高。
实例实验效果:
本文的实验效果和上一篇文章一样,只是实现的方式不一样
通道1接地、通道2接1.5V电源、通道3接VCC
上一篇文章内容:
本文讲述的知识点相对较多,若初次学习STM32的ADC转换功能,可以参考我另外一篇相对简单一点的文章:
STM32F10x_ADC1单通道单次采集
关于本文的更多详情请往下看。
Ⅱ、实例工程下载
笔者针对于初学者提供的例程都是去掉了许多不必要的功能,精简了官方的代码,对初学者一看就明白,以简单明了的工程供大家学习。
笔者提供的实例工程都是在板子上经过多次测试并没有问题才上传至360云盘,欢迎下载测试、参照学习。
提供下载的软件工程是基于Keil(MDK-ARM) V5版本、STM32F103ZE芯片,但F1其他型号也适用(适用F1其他型号: 关注微信,回复&修改型号&)。
STM32F10x_ADC三通道DMA连续转换(3通道、软件单次触发)实例源代码工程:
STM32F1资料:
& 访问密码 ca90
Ⅲ、关于ADC
关于ADC的介绍及功能,请下载参考手册查看,笔者这里讲述几点重要的知识:
1.12位分辨率
在STM32所有系列芯片中只有少部分是16位的,如:F373芯片。
12位分辨率意味着我们采集电压的精度可以达到:Vref /4096。
采集电压 = Vref * ADC_DR / 4096;
Vref:参考电压
ADC_DR:读取到ADC数据寄存器的值
由于寄存器是32位的,在配置的时候分左对齐和右对齐,一般我们使用右对齐,也就是对低12位数据为有效数据。
2.转换模式
A.单次和连续转换
单次:单通道单次转换、多通道单次(分多次)转换;
连续:单通道连续转换、多通道连续(循环)转换;
B.双ADC模式
也就是使用到了两个ADC,比如:ADC1和ADC2同时使用也就是双ADC模式。在该模式下可以配置为如下一些模式:同步规则模式、同步注入模式、独立模式等。
触发源就是触发ADC转换的来源,有外部中断线、定时器、软件等触发源。我们初学者常用软件触发,也就是需要转换一次,我们软件启动一次(本文提供实例也是软件触发)。
Ⅳ、本文实例描述
本文实例中关于ADC部分的配置及知识点,针对初学者相对比较多、理解起来也相对比较难一点。
根据题目&ADC三通道逐次转换(单次、单通道软件触发)&我们不难理解其转换的过程,但如何实现是一个难点。
1、三通道:我们定义了3条通道ADC1的ADC_Channel_1、ADC_Channel_2、ADC_Channel_3.
2.逐次转换:我们使用的是间断模式(规则组),也就是在规则组中定义了触发转换的序列。
3.单次:我们是每触发一次转换一次。
4.单通道:每次触发只转换一条通道。
以简单的示意图来说明其原理:
实例总共有三条通道通道1、通道2、通道3,分别对应顺序,是1、2、3。我们是通过软件来定义的顺序:
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 2, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 3, ADC_SampleTime_55Cycles5);
所以,我们转换保存的顺序:ADC_Buf[0]是通道1的数据、ADC_Buf[1]是通道2的数据、ADC_Buf[2]是通道3的数据
也是按照上面来的。当然,也可以更改顺序。
Ⅴ、源代码分析
笔者以F1标准外设库(同时也建议初学者使用官方的标准外设库)为基础建立的工程,主要以库的方式来讲述(若您的F1芯片与提供工程不一样,可微信回复&修改型号&)。
下面将讲述ADC重要的几点:
1.输入引脚配置
该函数位于adc.c文件下面;
引脚与通道的对应关系请参看你使用芯片的数据手册。
为什么是&ADC123_IN1&? 而不是ADC1_IN1,或者ADC2_IN1?
原因是ADC1、ADC2和ADC3共用这些引脚。
2. DMA配置
该函数位于adc.c文件下面;
1.外设地址:DMA_PeripheralBaseAddr = (uint32_t)(&(ADC1-&DR));
我们使用ADC数据寄存器地址作为DMA的外设地址;
2.内存地址:DMA_MemoryBaseAddr = (uint32_t)ADC_B
这里就是我们定义保存采集值数组的地址;
3.传输方向:DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_DIR_PeripheralSRC:外设 -& 内存
DMA_DIR_PeripheralDST:内存 -& 外设
4.传输长度:DMA_BufferSize = ADC_BUF_SIZE;
ADC_BUF_SIZE是一个宏定义,等于3; 也就是说我们需要转换并保存3组数据(3条通道的值)。
5.外设地址增长:DMA_PeripheralInc = DMA_PeripheralInc_D
由于外设的地址都是ADC数据寄存器,没有改变,所以不需要增长地址;
6.内存地址增长:DMA_MemoryInc = DMA_MemoryInc_E
由于我们定义了一个数字,里面需要保存3个数值,所以需要增长;
【根据传输长度和循环模式,可以循环传输数据】
7.外设数据长度:DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfW
DMA_PeripheralDataSize_Byte:8位数据
DMA_PeripheralDataSize_HalfWord:16位数据
DMA_PeripheralDataSize_Word:32位数据
由于我们使用16位的数据,所以使用DMA_PeripheralDataSize_HalfWord;
8.内存数据长度:DMA_MemoryDataSize = DMA_MemoryDataSize_HalfW
和&外设数据长度&类似;
9.循环模式:DMA_Mode = DMA_Mode_C
这里说的循环就是我们循环采集3组数据(更加传输长度来确定);
10.优先级:DMA_Priority = DMA_Priority_VeryH
优先级应该都明白他的意思,我们只使用一组DMA这个优先级可高可低;
11.优先级:DMA_M2M = DMA_M2M_D
内存传输到内存:否
为什么我们是使用DMA1_Channel1?
我们使用DMA通道是有要求的,需按照手册提供的规则来(如下图);请参看手册:
3. ADC配置
该函数位于adc.c文件下面;
这个函数是本文的重点,下面依次来讲述源代码内容的意思;
A.初始化基本参数:
工作模式:ADC_Mode = ADC_Mode_I
总共有10种,主要都是针对双ADC下使用。针对初学者这里不多描述,感兴趣的朋友可以先自行研究一下各个模式的使用。
浏览模式:ADC_ScanConvMode = ENABLE;
主要是针对多条通道而言,也就是说你是否有多条通道。
多通道:ENABLE;
单通道:DISABLE;
转换模式:ADC_ContinuousConvMode = DISABLE;
这里是配置是否需要连续转换。
连续转换ENABLE:也就是只需要启动(触发)转换一次,后面就不用再次启动(触发)就可以连续工作了。
单次转换DISABLE:也就是根据一次转换完后需要再次启动(触发)才能工作。
触发方式:ADC_ExternalTrigConv = ADC_ExternalTrigConv_N
触发方式也就是使用什么方法触发ADC转换。哟定时器、外部触发、软件触发,一般常用软件触发。这里有很多种触发方式,详情可以参考其参数。
对其方式:ADC_DataAlign = ADC_DataAlign_R
右对其:低12位数据为有效位(常用);
左对其:高12为数据为有效位;
通道数:ADC_NbrOfChannel = 3;
这个参数比较简单,我们定义工作的通道数量。
B.设置规则组通道:
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 2, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 3, ADC_SampleTime_55Cycles5);
我们定义通道1的转换顺序为第1、通道2的转换顺序为第2、通道3的转换顺序为第3;
ADC_ResetCalibration(ADC1);&&&&&&&&&&&&&&&&&&& //校验复位
while(ADC_GetResetCalibrationStatus(ADC1));&&& //等待复位完成
ADC_StartCalibration(ADC1);&&&&&&&&&&&&&&&&&&& //开始ADC1校准
while(ADC_GetCalibrationStatus(ADC1));&&&&&&&& //等待校验完成
建议每次上电校正一次。
ADC有一个内置自校准模式。校准可大幅减小因内部电容器组的变化而造成的准精度误差。在校准期间,在每个电容器上都会计算出一个误差修正码(数字值),这个码用于消除在随后的转换中每个电容器上产生的误差。
关于STM32的ADC转换这一块功能确实交强大也相对来说比较复杂,或许文中讲述的还不够清楚,若有不清楚的可以关注微信,在微信上留言。
关于笔者提供的软件工程实例,可关注微信,在会话框回复&关于工程&,有关于工程结构描述、型号修改等讲述。
以上总结仅供参考,若有不对之处,敬请谅解。
更多精彩文章我将第一时间在微信公众号里面分享,该文有什么疑问可留言。
本着免费分享的原则,方便大家手机学习知识,定期在微信平台分享技术知识。如果你觉得分享的内容对你有用,又想了解更多相关的文章,请用微信搜索&EmbeddDeveloper& 或者扫描下面二维码、关注,将有更多精彩内容等着你。
阅读(...) 评论()

我要回帖

更多关于 连续梁体系转换顺序 的文章

 

随机推荐