历史上的今天
返回首页

历史上的今天

今天是:2024年09月26日(星期四)

正在发生

2021年09月26日 | 关于STM32F0系列多路ADC单独采样数据相同问题的处理

2021-09-26 来源:eefocus

先看一下,大家认为“正确”的代码


void MYADC_init(void) {

//时钟使能

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

//GPIO配置

GPIO_InitTypeDef PORT_ADC;

PORT_ADC.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;

PORT_ADC.GPIO_Mode = GPIO_Mode_AN;

PORT_ADC.GPIO_PuPd = GPIO_PuPd_NOPULL;

GPIO_Init(GPIOA, &PORT_ADC);

//ADC配置

ADC_InitTypeDef ADC_InitStuctrue;

ADC_InitStuctrue.ADC_Resolution = ADC_Resolution_12b;

ADC_InitStuctrue.ADC_ContinuousConvMode = DISABLE;

ADC_InitStuctrue.ADC_ExternalTrigConv= ADC_ExternalTrigConvEdge_None;

ADC_InitStuctrue.ADC_DataAlign = ADC_DataAlign_Right;

ADC_InitStuctrue.ADC_ScanDirection = ADC_ScanDirection_Backward;

ADC_Init(ADC1, &ADC_InitStuctrue);

//ADC使能

ADC_Cmd(ADC1, ENABLE);

}

 

unsigned short MYADC_getValue(unsigned char arg0) {

if(arg0==1){

ADC_ChannelConfig(ADC1, ADC_Channel_1, ADC_SampleTime_239_5Cycles);

}else if(arg0==2){

ADC_ChannelConfig(ADC1, ADC_Channel_2, ADC_SampleTime_239_5Cycles);

}else if(arg0==3){

ADC_ChannelConfig(ADC1, ADC_Channel_3, ADC_SampleTime_239_5Cycles);

}

while (ADC_GetFlagStatus(ADC1, ADC_FLAG_ADRDY) == RESET);

ADC_StartOfConversion(ADC1);

while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);

return ADC_GetConversionValue(ADC1);

}

 

int main(void){

//此处完成你的各种初始化

MYADC_init();

 

unsigned short adcValue1;

unsigned short adcValue2;

unsigned short adcValue3;

while(1){

adcValue1=MYADC_getValue(1);

//此处加入程序,如将adcValue打印发送出来

adcValue2=MYADC_getValue(2);

//此处加入程序,如将adcValue打印发送出来

adcValue3=MYADC_getValue(3);

//此处加入程序,如将adcValue打印发送出来

}

}


以上代码,是我之前认为“正确”的代码,但是当执行while时,一开始打印出来的3个值adcValue1,adcValue2和adcValue3都是正确的,但是后面继续打印的数据都是同adcValue3。

那是什么原因造成的吗?


原来,问题出在ADC_ChannelConfig()函数。


大家可以在STM32库源文件中找到如下图所示代码。

问题在于,库函数中对ADC通道选择寄存器的赋值用的是或“|”,当while(1)第一次执行该函数时,ADC_Channel=0x00000001,CHSELR=0x00000001,ADC转换数据对应第一通道,第二次执行该函数的时候,ADC_Channel=0x00000010,CHSELR=0x00000011,因为是独立采样模式,系统对高位有效通道进行采样,对应结果为第2通道的值。第三次执行该函数时,ADC_Channel=0x0000100,CHSELR=0x00000111,同样,因为是独立采样模式,对应结果为第3通道的值。在while再次循环时,我们预期结果希望是第一通道,但是实际上此时的CHSELR值已经是0x00000111了,在和0x00000001相或,值还是0x00000111,所以实际结果是最高位,即第3通道的值。


针对多通道单独采样模式,个人建议直接对CHSELR寄存器进行赋值,使用方法如下:


unsigned short MYADC_getValue(unsigned char arg0) {

if(arg0==1){

ADC_ChannelConfig(ADC1, ADC_Channel_1, ADC_SampleTime_239_5Cycles);

ADC1->CHSELR =ADC_Channel_1;

}else if(arg0==2){

ADC_ChannelConfig(ADC1, ADC_Channel_2, ADC_SampleTime_239_5Cycles);

ADC1->CHSELR =ADC_Channel_2;

}else if(arg0==3){

ADC_ChannelConfig(ADC1, ADC_Channel_3, ADC_SampleTime_239_5Cycles);

ADC1->CHSELR =ADC_Channel_3;

}

while (ADC_GetFlagStatus(ADC1, ADC_FLAG_ADRDY) == RESET);

ADC_StartOfConversion(ADC1);

while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);

return ADC_GetConversionValue(ADC1);

}

推荐阅读

史海拾趣

Custom Components Inc公司的发展小趣事

Custom Components Inc(简称CCI)公司的发展历程始于一个技术突破。在公司成立的初期,CCI的研发团队成功开发了一种新型的电子元件,这种元件在性能和成本上均优于市场上的同类产品。这一技术突破立即引起了行业的关注,多家电子设备制造商纷纷向CCI抛出橄榄枝,希望建立长期合作关系。

随着市场需求的不断增长,CCI逐步扩大了生产规模,并通过技术创新不断提升产品质量。同时,公司还积极开拓国际市场,与海外客户建立了稳定的业务往来。凭借卓越的产品性能和良好的市场口碑,CCI逐渐在电子行业中崭露头角。

Holt Integrated Circuits公司的发展小趣事

Holt在CAN控制器领域也取得了重要突破。作为世界上第一家将CAN控制器和收发器集成在同一紧凑塑料封装中的公司,Holt的ARINC 825(CAN)数据总线产品为用户提供了极大的便利。这种集成设计不仅减小了产品的体积和重量,还提高了系统的可靠性和稳定性。Holt的这一创新成果,不仅推动了CAN总线技术在航空航天领域的广泛应用,也为其他行业的自动化控制提供了有力支持。

以上五个故事,从不同角度展现了Holt Integrated Circuits公司在电子行业中的发展历程和卓越成就。这些事实不仅证明了Holt在技术创新和市场拓展方面的实力,也为其在未来的发展中奠定了坚实的基础。

FCT electronic公司的发展小趣事

在环保和可持续发展成为全球共识的背景下,FCT electronic公司积极响应这一趋势,致力于推动绿色环保和可持续发展。公司采用了环保材料和工艺,减少了对环境的污染;同时,FCT electronic公司还加强了废物回收和资源利用方面的工作,实现了资源的循环利用和节约。这些努力不仅使FCT electronic公司在环保方面取得了显著成绩,也为公司的可持续发展奠定了坚实基础。

EMI Filter Company公司的发展小趣事

Kemet公司在EMI滤波器领域也有着一席之地。他们致力于研发符合环保标准的EMI滤波器。随着全球对环保问题的日益重视,Kemet看到了绿色环保EMI滤波器的巨大潜力。他们采用环保材料和无铅工艺,生产出了符合RoHS标准的EMI滤波器。这些产品不仅性能稳定,而且对环境友好,赢得了众多环保意识强烈的客户的青睐。

General Electric Company公司的发展小趣事
在工业自动化控制系统中,用于驱动高压电机、阀门等执行机构。
Datatronic公司的发展小趣事

Datatronic公司深知人才是企业发展的核心。因此,公司一直注重人才的培养和引进。公司建立了完善的人才培训体系,为员工提供广阔的发展空间和机会。同时,公司还积极引进国内外优秀人才,为公司的技术创新和市场拓展提供了有力支持。这些举措使得Datatronic公司在人才方面形成了竞争优势。

问答坊 | AI 解惑

linux内核版本选择跟ARM芯片型号有关吗?

s3c2410大多移植2.4内核或是uclinux, 2440以后基本都是2.6内核,请问内核版本选择跟芯片有关吗? 网上看到有人在2410板子上移植成功2.6内核, 请问这样的配合合理吗? 会不会有在奔3机子上装winXP这种感觉呢?…

查看全部问答>

探秘中国IC设计发展迷局(四):硅谷模式不适全中国环境

四、硅谷模式不适全中国环境 很多从硅谷回国的海归在创业失败后,都会说,在中国运营公司比在硅谷要难。笔者在2005年和2006年认识了很多的回国创业的海归人士,当年都是雄心勃勃,结果,几年下来,现在大都已经宣布公司倒闭,有的回到美国去了,有 ...…

查看全部问答>

寻LED 电源老化装置

请问坛中谁有LED 电源老化的装备;此种装备可以让LED驱动做批量老化用;这种装备只能用led? 可否用功率电阻。…

查看全部问答>

求横流电路PCB 有奖励

本帖最后由 paulhyde 于 2014-9-15 09:12 编辑 求横流电路PCB 有奖励  …

查看全部问答>

【ADC10_B】怎么使用?

ADC10_B只有一个ADC10MEM0,也就是每次只能转化一个通道数据,如果我想同时转化多个通道的数据该怎么办呢?   我原本的想法有两个:   第一,采用Single-channel, single-conversion,每次转换好一个通道后,写指令改通道,再转换, ...…

查看全部问答>

TI femto solution

本帖最后由 dontium 于 2015-1-23 13:12 编辑 TI的收发集成方案请参考下面连接.AFE7225,TRF3720,TRF3711 ti./solution/femto_base_station …

查看全部问答>

新人求助 如何实现共阴数码管的控制

想做一个对共阴数码管和独立按键的操控,没想到输出的共阴数码管的信号最后是乱码……也不动,按键按了也不变,这个程序也没做完,我看把基本的加法实现了减法应该也能实现(从0+到99),但是没想到遇到了这样的问题,请大神帮忙看看代码有什么问题 ...…

查看全部问答>

哪个跑过TI DEMO2540 。。就是那个最简单的测试程序

我现在USB  DONGLE  端口 写00X0028  和1     或者 2 的时候蜂蜜器叫的方式不一样,,这个 00X0028  和1     或者 2 为什么是这个数字…

查看全部问答>