stm32f1 48pin adc1stm32 adc多通道采样对应哪些引脚

21ic官方微信
后使用快捷导航没有帐号?
查看: 7712|回复: 8
如何同时使用STM32的ADC1和ADC2转换不同的通道?
&&已结帖(10)
主题帖子积分
中级技术员, 积分 177, 距离下一级还需 123 积分
中级技术员, 积分 177, 距离下一级还需 123 积分
主题帖子积分
专家等级:结帖率:92%
主题帖子积分
中级技术员, 积分 177, 距离下一级还需 123 积分
中级技术员, 积分 177, 距离下一级还需 123 积分
我要转换的通道为ADC12_IN2~ADC12_IN7,为了控制转换时间,我希望ADC1和ADC2同时各转换3个通道,如ADC1负责ADC12_IN2~ADC12_IN4,ADC2负责ADC12_IN5~ADC12_IN7.
有人说使用同步规则模式,如下:
按照上图,ADC1和ADC2会转换我所有的通道啊,只是一个正序一个反序吧?
满意回复+5
ADC1->SQR3 |= UabAinCH SQR3 |= UbcAinCH SQR3 |= UcaAinCH SQR3 |= U0AinCH SQR3 |= UcapAinCH SQR3 |= 6 SQR2 |= 7 SQR2 |= 8 SQR2 |= 9 SQR2 |= 10 SQR2 |=
请LZ可以看看固件库中的例子。
本帖子中包含更多资源
才可以下载或查看,没有帐号?
主题帖子积分
初级工程师, 积分 2708, 距离下一级还需 292 积分
初级工程师, 积分 2708, 距离下一级还需 292 积分
主题帖子积分
专家等级:结帖率:5%
主题帖子积分
初级工程师, 积分 2708, 距离下一级还需 292 积分
初级工程师, 积分 2708, 距离下一级还需 292 积分
ADC1-&SQR3 |= UabAinCH && 0;& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //设置规则序列中每个转换的通道号,转换号与通道号可以不对应,例如:第
& & & & ADC1-&SQR3 |= UbcAinCH && 5;& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //一个转换通道16或者其他通道而不一定就是通道1,这样做的好处是:设计
& & & & ADC1-&SQR3 |= UcaAinCH && 10;& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //图纸时模拟输入引脚就没有顺序要求,给设计带来极大的方便.
& & & & ADC1-&SQR3 |= U0AinCH && 15;
& & & & ADC1-&SQR3 |= UcapAinCH && 20;
& & & & ADC1-&SQR3 |= 6 && 25;
& & & & ADC1-&SQR2 |= 7 && 0;& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //设置规则序列中的通道号
& & & & ADC1-&SQR2 |= 8 && 5;
& & & & ADC1-&SQR2 |= 9 && 10;
& & & & ADC1-&SQR2 |= 10 && 15;
& & & & ADC1-&SQR2 |= 11 && 20;
& & & & ADC1-&SQR2 |= 12 && 25;
& & & & ADC1-&SQR1 |= 13 && 0;& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //设置规则序列中的通道号
& & & & ADC1-&SQR1 |= 14 && 5;
& & & & ADC1-&SQR1 |= 15 && 10;
& & & & ADC1-&SQR1 |= 16 && 15;
& & & & ADC1-&SQR1 |= AdcChNum-1 && 20;& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //设置规则组模拟输入通道数
ADC2-&SQR3 |= IaAinCH && 0;& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //设置规则序列中每个转换的通道号,转换号与通道号可以不对应,例如:第
& & & & ADC2-&SQR3 |= IbAinCH && 5;& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //一个转换通道16或者其他通道而不一定就是通道1,这样做的好处是:设计
& & & & ADC2-&SQR3 |= IcAinCH && 10;& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //图纸时模拟输入引脚就没有顺序要求,给设计带来极大的方便.
& & & & ADC2-&SQR3 |= I0AinCH && 15;
& & & & ADC2-&SQR3 |= UBatAinCH && 20;
& & & & ADC2-&SQR3 |= 6 && 25;
& & & & ADC2-&SQR2 |= 7 && 0;& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //设置规则序列中的通道号
& & & & ADC2-&SQR2 |= 8 && 5;
& & & & ADC2-&SQR2 |= 9 && 10;
& & & & ADC2-&SQR2 |= 10 && 15;
& & & & ADC2-&SQR2 |= 11 && 20;
& & & & ADC2-&SQR2 |= 12 && 25;
& & & & ADC2-&SQR1 |= 13 && 0;& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //设置规则序列中的通道号
& & & & ADC2-&SQR1 |= 14 && 5;
& & & & ADC2-&SQR1 |= 15 && 10;
& & & & ADC2-&SQR1 |= 16 && 15;
& & & & ADC2-&SQR1 |= AdcChNum-1 && 20;& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //设置规则组模拟输入通道数
主题帖子积分
中级技术员, 积分 177, 距离下一级还需 123 积分
中级技术员, 积分 177, 距离下一级还需 123 积分
主题帖子积分
专家等级:结帖率:92%
主题帖子积分
中级技术员, 积分 177, 距离下一级还需 123 积分
中级技术员, 积分 177, 距离下一级还需 123 积分
请问2L,您配置的ADC1和ADC2的转换模式是什么呢?转换数据如何通过DMA读取吗?
主题帖子积分
主题帖子积分
专家等级:结帖率:38%打赏:0.00受赏:9.00
主题帖子积分
请LZ可以看看固件库中的例子。
I do not teach, but I coach. I do not feed, but I seed.
欢迎访问我的博客:/BLOG_OWNER_199055.HTM
主题帖子积分
中级技术员, 积分 177, 距离下一级还需 123 积分
中级技术员, 积分 177, 距离下一级还需 123 积分
主题帖子积分
专家等级:结帖率:92%
主题帖子积分
中级技术员, 积分 177, 距离下一级还需 123 积分
中级技术员, 积分 177, 距离下一级还需 123 积分
非常感谢!在您的提示下,终于找到了固件库中的例子并解决了遇到的问题。感觉,是手册中的那张图误导了我。。。
同时感谢2L的关注和帮助!
主题帖子积分
高级工程师, 积分 7076, 距离下一级还需 924 积分
高级工程师, 积分 7076, 距离下一级还需 924 积分
主题帖子积分
专家等级:结帖率:23%
主题帖子积分
高级工程师, 积分 7076, 距离下一级还需 924 积分
高级工程师, 积分 7076, 距离下一级还需 924 积分
手册上的那张图确实容易误导
主题帖子积分
资深技术员, 积分 468, 距离下一级还需 32 积分
资深技术员, 积分 468, 距离下一级还需 32 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
资深技术员, 积分 468, 距离下一级还需 32 积分
资深技术员, 积分 468, 距离下一级还需 32 积分
手册没有看明白
主题帖子积分
助理工程师, 积分 1909, 距离下一级还需 91 积分
助理工程师, 积分 1909, 距离下一级还需 91 积分
主题帖子积分
专家等级:结帖率:91%打赏:0.33受赏:0.00
主题帖子积分
助理工程师, 积分 1909, 距离下一级还需 91 积分
助理工程师, 积分 1909, 距离下一级还需 91 积分
主题帖子积分
实习生, 积分 26, 距离下一级还需 24 积分
实习生, 积分 26, 距离下一级还需 24 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 26, 距离下一级还需 24 积分
实习生, 积分 26, 距离下一级还需 24 积分
正需要呀,lz能够共享一下代码吗
时间类勋章
精华达人奖章
等级类勋章
荣誉元老奖章
等级类勋章
坚毅之洋流
发帖类勋章
时间类勋章
技术领袖奖章
人才类勋章
技术高手奖章
人才类勋章
涓涓之细流
发帖类勋章
社区建设奖章
等级类勋章
湍急之河流
发帖类勋章
时间类勋章
技术导师奖章
人才类勋章
技术新星奖章
人才类勋章求帮理清adc和通道的概念_stm32吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:18,218贴子:
求帮理清adc和通道的概念收藏
如图,PA1对应了ADC123_IN1。。本人新手,摸索了好几天了。。IN1就是所谓的通道1,意思就是如果我使用PA1口作为接收信号的口,(1)那么配置寄存器的时候只能将这个口设置为ADC1或者2或者3,然后通道只能是1,对么?。。(2)不是说每个ADC都对应了十几个通道么,那么这里为什么只能是一个通道呢?(3)如果哪个大神好心人,帮我看下,我该怎么修改以下一段配置PA1为ADC1的代码。。变成配置PA2为ADC2的效果。我不知道改哪些地方啊void
Adc_Init(void){
RCC-&APB2ENR|=1&&2;
GPIOA-&CRL&=0XFFFFFF0F;
RCC-&APB2ENR|=1&&9;
RCC-&APB2RSTR|=1&&9;
RCC-&APB2RSTR&=~(1&&9);
RCC-&CFGR&=~(3&&14);
RCC-&CFGR|=2&&14;
ADC1-&CR1&=0XF0FFFF;
ADC1-&CR1|=0&&16;
ADC1-&CR1&=~(1&&8);
ADC1-&CR2&=~(1&&1);
ADC1-&CR2&=~(7&&17);
ADC1-&CR2|=7&&17;
ADC1-&CR2|=1&&20;
ADC1-&CR2&=~(1&&11);
ADC1-&SQR1&=~(0XF&&20);
ADC1-&SQR1|=0&&20;
ADC1-&SMPR2&=~(7&&3);
ADC1-&SMPR2|=7&&3;
ADC1-&CR2|=1&&0;
ADC1-&CR2|=1&&3;
while(ADC1-&CR2&1&&3);
ADC1-&CR2|=1&&2;
while(ADC1-&CR2&1&&2);
}u16 Get_Adc(u8 ch)
ADC1-&SQR3&=0XFFFFFFE0;
ADC1-&SQR3|=
ADC1-&CR2|=1&&22;
while(!(ADC1-&SR&1&&1));
return ADC1-&DR;
}u16 Get_Adc_Average(u8 ch,u8 times){
u32 temp_val=0;
for(t=0;t&t++)
temp_val+=Get_Adc(ch);
delay_ms(5);
return temp_val/}
~用库函数好看一点。
你需要做的是去查你所用的芯片手册,adc1确实是有十几个通道的,但是每一个通道他所对应固定的引脚,不是你想设置成哪个就是哪个,拿PA1来说,他本来就只是adc1的通道1,所以你需要配置的就是adc,gpio
还有就是以后给别人看代码,尽量上库函数版本,寄存器版本看起来本身就比较费劲,还要查
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或查看: 25348|回复: 71
【STM32使用原创】STM32的ADC多通道采集的实现
马上注册,结交更多好友,享用更多交流,硬件的世界向你敞开大门!
才可以下载或查看,没有帐号?
在经过半个月的不懈努力下,终于将32的ADC多通道的信号采集完成,在网上能找到一些对于多通道信号采集的范例,要么就是用多个ADC,要么就是指贴出部分关键代码,也不对其中的配置及实现做一些细致的说明,这让人会走很多弯路,但也正是这样才能不断提升,才能认识自己的不足。好了,下面就先对STM的ADC做个简单的介绍;
& && && &ADC又称'模拟/数字转换器',在STM32单片机中模拟/数字转换器(ADC)是一种提供可选择多通道输入,逐次逼近型的模数转换器。分辨率为12位,在一般的信号采集应用中已经算是很高的分辨率了。
& && &&&它有18个通道,可测量16个外部和2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。
& && &&&下面就是对ADC多通道采集是如何实现做详细说明:
& && &&&第一:先讲讲大家在调试这功能可能遇到的一些困惑,我也是这样过来的,不知道你们是不是这样.
& && &&&1、范例是用DMA的方式对所采集到的数据进行的读取,这是我首先困惑的,存储到哪个地方去了,为此我还专门看了DMA(直接记忆存取/直接内存存取)到底是什么东西;
& && &&&2、我们就认为采集的数据已经被DMA提取并存储了,怎么把这么多通道的数据分离!!! 真滴是伤神~~~
& && &&&把上面这两个主要的大问题解决了,那么就能将这个模块调通,并能在实际中得到应用。16路信号的采集还不是小小的应用哟~~~
& && &&&下面上代码
//多通道转换函数
vu32 ADC_MultiChannelConvertedV
void ADC1_MultiChannel_Configuration(void)
& && &&&GPIO_InitTypeDef GPIO_InitS
& && &&&DMA_InitTypeDef DMA_InitS
& && &&&ADC_InitTypeDef ADC_InitS
& && &&&//ADC input init PA0-7 AD0-7
& && &&&GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
& && &&&GPIO_InitStructure.GPIO_Pin = GPIO_PinSource0|GPIO_PinSource1|GPIO_PinSource2|GPIO_PinSource3|GPIO_PinSource4|GPIO_PinSource5|GPIO_PinSource6|GPIO_PinSource7;
& && &&&GPIO_Init(GPIOA,&GPIO_InitStructure);
& && &&&//ADC input init PB0-1 AD8-9
& && &&&GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
& && &&&GPIO_InitStructure.GPIO_Pin = GPIO_PinSource0|GPIO_PinSource1;
& && &&&GPIO_Init(GPIOB,&GPIO_InitStructure);
& && &&&//ADC input init Pc0-5 AD10-15
& && &&&GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
& && &&&GPIO_InitStructure.GPIO_Pin = GPIO_PinSource0|GPIO_PinSource1|GPIO_PinSource2|GPIO_PinSource3|GPIO_PinSource4|GPIO_PinSource5;
& && &&&GPIO_Init(GPIOC,&GPIO_InitStructure);
& && && && && &
& && &&&DMA_DeInit(DMA1_Channel1);//开启DMA1的第一通道
& && &&&DMA_InitStruct.DMA_PeripheralBaseAddr = ADC1_DR_A //DMA对应的外设基地址
& && &&&DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfW
& && &&&DMA_InitStruct.DMA_MemoryBaseAddr = (unsigned long)&ADC_MultiChannelConvertedValue;& && &&&这就是单片机采集后存储的值的地址
& && &&&DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC;
& && &&&DMA_InitStruct.DMA_M2M = DMA_M2M_D
& && &&&DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_W//DMA_MemoryDataSize_HalfWord&&DMA搬运的数据尺寸,注意ADC是12位的,HalfWord就是16位。这个地方只有用word方式才能对位转换搬移,具体原因不详wxm
& && &&&DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_D
& && &&&DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_E //接收一次数据后,目标内存地址是否后移--重要概念,用来采集多个数据的,多通道的时候需要使能它
& && &&&DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_D//接收一次数据后,设备地址是否后移
& && &&&DMA_InitStruct.DMA_Mode&&= DMA_Mode_C//转换模式,循环缓存模式,常用
& && &&&DMA_InitStruct.DMA_Priority = DMA_Priority_H//DMA优先级,高
& && &&&DMA_InitStruct.DMA_BufferSize = 16;//DMA缓存大小,1*16个
& && &&&DMA_Init(DMA1_Channel1,&DMA_InitStruct);
& && &&&ADC_InitStruct.ADC_Mode = ADC_Mode_I //转换模式,为独立转换
& && &&&ADC_InitStruct.ADC_ScanConvMode = ENABLE;
& && &&&ADC_InitStruct.ADC_ContinuousConvMode = ENABLE; //连续转换模式开启
& && &&&ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_N//ADC外部触发开关,关闭
& && &&&ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_R //对齐方式,ADC结果是12位的,显然有个对齐左边还是右边的问题。一般是右对齐
& && &&&ADC_InitStruct.ADC_NbrOfChannel = 16; //开启通道数,16个
& && &&&ADC_Init(ADC1, &ADC_InitStruct);
& && &&&/* Enable ADC1 */
& && &&&ADC_Cmd(ADC1, ENABLE);
& && &&&/* Enable ADC1 reset calibaration register */& &
& && &&&ADC_ResetCalibration(ADC1);
& && &&&/* Check the end of ADC1 reset calibration register */
& && &&&while(ADC_GetResetCalibrationStatus(ADC1));
& && &&&/* Start ADC1 calibaration */
& && &&&ADC_StartCalibration(ADC1);
& && &&&/* Check the end of ADC1 calibration */
& && &&&while(ADC_GetCalibrationStatus(ADC1));&&
//多通道转换函数
u8 MultiChannel_AsciiBuff[5];
void Read_ADC1_MultiChannel(unsigned char u8_channNo)
& && && & unsigned short&&ADC_data = 0;
& && &&&unsigned char i,
& && &&&ADC_SoftwareStartConvCmd(ADC1, DISABLE);
& && && && && &
& && &&&for(i=16;i&0;i--)
& && &&&{& && &&&
& && && && && & //ADC1,ADC 通道 x,规则采样顺序值为 1,采样时间为 7.5 周期,大于此周期除了通道 0 能识别外,其他不能识别
& && && && && & ADC_RegularChannelConfig(ADC1, u8_channNo, 1, ADC_SampleTime_7Cycles5 );
& && && && && & ADC_SoftwareStartConvCmd(ADC1, ENABLE);& && && && && && && && & /* 软件启动 ADC1 */& && && && && &
& && && && && & do
& && && && && & {
& && && && && && && && &id = ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC);& && && && && && && && & /* 读取转换标志 */
& && && && && & }& && &&&while(!id);& && && && && && && && && && && && && && && && && && && && && && && && && && && &/* 等待,直到转换完成 */
& && && && && &
& && && && && & ADC_data += ADC_GetConversionValue(ADC1);& && && && && && && && && && &&&这里将值读出,后面就是解析的过程咯
& && && && && & ADC_SoftwareStartConvCmd(ADC1, DISABLE);& && && && && && && && && && && &/* 软件停止 ADC1 */& && && && && && && && && && && && && && && && && && && && && && && && &&&
& && && && && && && && && && && &
& && &&&ADC_data = ADC_data && 4;& && && && && && && && && && && && && && && && && && && && && && && && & /* 取 16 次采样平均值 */& && &&&
& && &&&ADC_data = (unsigned int)(((unsigned int)ADC_data)*3300&&12);/* 把采集到的数值转换成电压数据 */
& && &&&MultiChannel_AsciiBuff[0] = ADC_data/1000%10 + 0x30;
& && &&&MultiChannel_AsciiBuff[1] = ADC_data/100%10 + 0x30;
& && &&&MultiChannel_AsciiBuff[2] = ADC_data/10%10 + 0x30;& && && && && && && && && && && && && && && && & /* 数据分离送 USART1 显示 */
& && &&&MultiChannel_AsciiBuff[3] = ADC_data%10 + 0x30;
& && &&&MultiChannel_AsciiBuff[4] = 0;
& && &&&USART1Write((u8*)MultiChannel_AsciiBuff,4);
& && &&&USART1Write((u8*)&\r\n&,sizeof(&\r\n&));
& && &&&//return (unsigned int)(((unsigned long)(ADC_data&&4))*3300&&12);
& && &&&对于那两个问题的答案也在这里面。首先是DMA的存储地址,用横着的红线做了标记;对于采集数据的分离在最后一个红色竖线部分。呵呵,看着是不是就很简单咯~& &
mark。。。。。。。。
备注挺详细。楼主费心了。。。
NB& & NB 收藏了
好好学习一下
东西不错,很有参考价值
必须要啊!!
可以好好做参考学习啊
好,写得很好
之前我也调试了非常久,关于ADC多路采集DMA传输的。刚开始是使用二维数组存放采集的数据,进行DMA传输。但是结果一直是出错的。
后面只能定义一个易挥发变量来储存数据,采集2^12次取均值为数字滤波方式来得到采样数据了。
现在把这个弄上去解决了没&
李牧林 发表于
之前我也调试了非常久,关于ADC多路采集DMA传输的。刚开始是使用二维数组存放采集的数据,进行DM ...
现在把这个弄上去解决了没
这样处理的话是解决了
但就是一直不明白当时出错在哪里&
首先先肯定楼主的好的帖子,不过我有点问题想问一下,我用上面两个函数,调试的时候为什么ADC的通道不管输入哪个通道,结果读出的都是AD0通道的,求解!!!!
void Read_ADC1_MultiChannel(unsigned char u8_channNo),在括号里面加入要读取的ADC的通道的号数0——16,这样才能读取,而且,所谓的多通道采集ADC并不是同时能采集那么多通道,他还是一个一个通道的采集,只不过&
地址:辽宁省大连市高新园区火炬路7号17层 QQ:
Copyright (C)
All Rights Reserved.stm32 ADC的通道与引脚是如何对应的
看芯片手册,这些都是规定好的,例如PA0,对应的ADC123_IN0指的就是通道0,需要注意的是ADC123这样的是三个ADC模块的通道都可以使用的,而ADC1这样的就只能使用ADC1模块的通道采样.
为您推荐:
其他类似问题
扫描下载二维码STM32中,ADC输入通道有18个,16个外部通道,2个内部通道,那16个外部通道输映射的引脚分别对应的什么啊?STM32中,ADC输入通道有18个,16个外部通道,2个内部通道,那16个外部通道输入映射的引脚分别对应的什么啊?像通道0输入口可以是PA0?手册中在哪找的?可否截个图看看
在STM32的(datasheet)数据手册中有,具体的型号引脚分布同,我给你一个我知道的型号的在网上搜下你的那个型号的datasheet&就可以找到了&
为您推荐:
其他类似问题
扫描下载二维码}

我要回帖

更多关于 stm32 adc多通道采样 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信