打印
[应用相关]

FAQ_BlueNRG-12中如何实现ADC12之间的切换

[复制链接]
414|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jcky001|  楼主 | 2021-3-10 09:21 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

问题 客户在使用BlueNRG-1/2 ADC模块时有需要使用到2路ADC通道,进而通常会碰到2个问题:

1. 在ADC1/2两个通道进行切换,获取外部采样值,总有一个通道的返回值是错误的。为什么?

2. 在切换ADC1/2是需要设置寄存器ADC-CONF的CHSEL字段,有时发现程序运行过后,设置值没有真正写入到寄存器中。为什么? 其实,以上两个问题其实是同一个问题的2个不同提问形式,问题的原因是同一个。


ST工程师回答:下面的措施可以解决客户的问题,但只适合用在在ST BlueNRG-1/2 SDK3.0.0(及以后版本)中,有一点需要明确的是,该解决措施和蓝牙协议栈中的”Controller Privacy 1.2”功能有冲突。即使用本解决办法后,将无法enable蓝牙协议栈中的”Controller Privacy 1.2”功能。 具体步骤如下:

1. 在IDE 中打开ST提供的BlueNRG-1/2 SDK3.0.0中的参考代码项目文件:“\Project\BlueNRG1_Periph_Examples\ADC\Polling”。 2. 移除宏定义”ADC_2411”.

3. 在IDE项目配置页面中添加宏定义”FORCE_CORE_TO_16MHZ”.


4. 在程序主环中做如下更改

  • while(1) {
  • /* Polling of End-Of-Conversion flag */
  • if( ADC_GetFlagStatus(ADC_FLAG_EOC)) {
  • /* Read converted data */
  • adc_value = ADC_GetConvertedData(xADC_InitType.ADC_Input, xADC_InitType.ADC_ReferenceVoltage);
  • /* Print the ADC value converted */
  • if(xADC_InitType.ADC_Input == ADC_Input_TempSensor) {
  • printf("ADC value: %.1f 'C\r\n", adc_value);
  • }
  • else {
  • printf("ADC value: %.0f mV\r\n", adc_value*1000.0);
  • }
  • SdkEvalLedToggle(LED1);
  • /* Application delay before next one shot measurement */
  • SdkDelayMs(500);
  • if(xADC_InitType.ADC_Input == ADC_Input_AdcPin1)
  • { xADC_InitType.ADC_Input = ADC_Input_AdcPin2; }
  • else
  • { xADC_InitType.ADC_Input = ADC_Input_AdcPin1; }
  • ADC->CONF_b.CHSEL = xADC_InitType.ADC_Input;
  • /* Enable auto offset correction */
  • ADC_Calibration(ENABLE);
  • ADC_AutoOffsetUpdate(ENABLE);
  • /* Start new conversion */
  • ADC_Cmd(ENABLE);
  • }
  • }

使用特权

评论回复
沙发
海滨消消| | 2021-3-10 10:22 | 只看该作者
我在使用开发板(STEVAL-IDB009V1) 测试ADC Polling的Demo程序,发现单独选择的ADC1引脚输入,读回的电压值正常2.7V,但单独选择的ADC2引脚输入,读回的电压值不正常13.54mV,请问下你知道这是怎么回事吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1505

主题

4526

帖子

6

粉丝