这几天,遇到一个问题。 基本可以确定是 ,所有F0系列都可能遇到的问题了 ,在使用HAL库开发的时候会遇到的。 我使用的式STM 32 F070F6P6的芯片,定义了 PA0为 ADC_IN0 , PA1为 ADC_IN1 ,开启了两路通道,单独不连续采样工作模式。
ADC的配置代码如图,使用CubeMX软件配置的,可以说比自己手动要准快狠 主要准有保证
。。。。。。。。。。。
然后我主函数里 不停的循环1秒读一次 ADC_IN0 , ADC_IN1 。
使用读函数是原子例程里的:
但是被我进行了修改,因为F0 HAL库里没有这些划红线的函数。于是我把它去掉了,正确。
每次读的时候 把该函数里 ( ADC1_ChanConf.Channel=ch; //通道) ch重新赋值为选定的通道就可以了。
如; ch =ADC_CHANNEL_0;
ch =ADC_CHANNEL_1; 然后去调用这个函数 就可以读到你选定通道的电平了。也没错。
第一次读值 使用 ch =ADC_CHANNEL_0; 可以读到正确电平。 第一次读值 使用 ch =ADC_CHANNEL_1; 也可以读到正确电平。
但他么 就是 第一次使用任意一个 ,(单片机不复位)第二次使用另一个值 ,就读的值还是第一次 通道的值。
以上如果一直只读一个通道,百分百没问题,想要切换通道 就不行,不管你配置多少通道,度多少次,始终都是第一次使用的通道的在进行采样。
于是百般询问各路网友,提供的方法都不行,于是我百度 到了,类似的,说是直接设置寄存器。
于是 我也怀疑这个 HAL库的函数可能有问题 ,于是就把 sConfig.Channel=ch; 使用 这个替代了 ADC1->CHSELR =ch;
哎呀 以为万事大吉,结果心灰意冷 ,险些撂挑子不干了,无奈了。
就在我放弃的时候,我吃了一把狗粮,人生又燃起了 奋斗的欲望。
就把这句话 移动一下位置,不曾想 却可以了。
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
把 ADC1->CHSELR =ch; 这句话 放到 HAL_ADC_ConfigChannel(&hadc, &sConfig);她的热屁股 !!! 后面!!!!
把 ADC1->CHSELR =ch; 这句话 放到 HAL_ADC_ConfigChannel(&hadc, &sConfig);她的热屁股 !!! 后面!!!!
把 ADC1->CHSELR =ch; 这句话 放到 HAL_ADC_ConfigChannel(&hadc, &sConfig);她的热屁股 !!! 后面!!!!
你就可以任意指挥每个通道 ,随心所欲,无所不能!
看图。谢谢
一周热门 更多>