iot-fan

联系: iotfan123#163.com
注意:
1,本博客之内容来源于网上收集以及相关技术人员提供,如果有侵犯到您的权益,请电邮我沟通;
2,本博客之内容乃分享,交流,学习,研究之目的,作者不对内容的真实性,有效性,及时性负责,也不对因本博客的任何内容导致的任何后果负责;
3,本博客之内容禁止转发到CSDN网站,转到别的网站请保留出处.

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

CH579/CH57x/CH58x ADC的使用


CH57x/CH58x系列ADC校准差异对比

芯片 差异说明
CH579 需要做粗调,细调,粗调时候复用PA5,所以用到ADC的话,如果使用粗调,通常PA5需要悬空
CH573 需要做粗调,不需要做细调, 粗调时候用的内部通道不再需要任何的外部IO
CH583 需要做粗调,粗调用ADC channel 1,但是粗调时候内部模拟通道会断开PA5,所以PA5不会对校准产生影响

ADC使用

粗调

粗调大概是可以理解为对VINTA校准,ADC对VINTA采样,然后offset到2048.对于ch579,其借用PA5来做粗调通道,当使用粗调时,不建议使用PA5作为其他功能,否则建议其他方式实现粗调.

什么时候需要做粗调

根据其原理上电校准一次即可.

粗调的结果使用

粗调的结果是个有符号的数据,可能是正数,也可能是负数,通常在几个到10几个采样单位之间;
使用就是把后面的采样的值,加上这个校准值作为实际参与计算电压的值,但是注意由于校准值是个有符号的值,当单端采样通道接到GND时候,加上校准值可能会小于0,有时候负数是很讨厌的,这里我们要软件上判断一下小于0就等于0来避免这种情况

细调

实际上是调斜率.

  • ch577/ch578/ch579 需要做斜率校准
  • CH571/573,ch58x系列的不需要

测量范围

CH57x,ch58x 系列的芯片内部的ADC的实现方式是逐次比较型的(SAADC),其参考电压Vref是1.05v(半量程).默认的电压测量范围是0-2.1v
芯片ADC的前级提供了一个PGA,可以通过调整其放大倍数,来实现不同的量程.

PGA增益 采样值到电压换算 理论可测电压上限 理论可测电压范围(Vref=1.05V+±0.015V) 建议实际测量电压范围
-12dB(1/4 倍) (ADC/512-3)*Vref 5*Vref -0.2V ~ VIO33+0.2V 2.9V ~ VIO33
-6dB(1/2 倍) (ADC/1024-1)*Vref 3*Vref -0.2V ~ 3.15V 1.9V ~ 3V
0db(1倍) (ADC/2048)*Vref 2*Vref 0V ~ 2.1V 0V ~ 2V
6db(2倍) (ADC/4096+0.5)*Vref 1.5*Vref 0.525V ~ 1.575V 0.6V ~ 1.5V

计算c代码

int16_t adc_raw;
adc_raw = ADC_ExcutSingleConver() + RoughCalib_Value;
//PGA=-12db
voltage_mv = adc_raw*1050/512 - (3*1050);
//PGA=-6db
voltage_mv = adc_raw*1050/1024 - (1*1050);
//PGA=0db
voltage_mv = adc_raw*1050/2048;
//PGA=6db
voltage_mv = adc_raw*1050/4096 + (1050/2);

定时采样+DMA

  • 只支持配置一个ADC channel
  • 定时分频的范围比较小(最大间隔:)
待编辑

低功耗下的ADC处理

引脚漏电

默认情况下,ADC引脚和所在GPIO引脚的数字功能是同时存在的,在进行ADC测量时候,需要吧GPIO设置为高阻输入,当ADC的电平处于中间态的时候,这时候往往会导致数字部分漏电,这时候我们可以通过寄存器 R16_PIN_ANALOG_IE来禁用相关的AIN通道所在的数字功能:

//ch58x 上禁用AIN11 所在模拟通道的数字功能
R16_PIN_ANALOG_IE |= RB_PIN_ADC11_IE

注意:有些位为多个通道共享的 如:

//ch58x 上禁用AIN4和AIN5 所在模拟通道的数字功能,共享一个控制位
R16_PIN_ANALOG_IE |= RB_PIN_ADC4_5_IE

ADC通道唤醒后丢失

待编辑

注意事项

1.CH577/578/579 PA5所在的ADC通道1用于校准(粗调),校准时候要悬空,实际上是内部拉到VINTA读取个值作为offset值,如果用了PA5不建议使用粗调,或者其他方式实现
2.当使用ADC时候,除了能够耐受5v输入的io外,其他的io输入电平禁止高于芯片的vcc供电电压.
3.校准值是个有符号的值,当单端采样通道接到GND时候,加上校准值可能会小于0
4.睡眠后ADC的channel会变成上电默认值, 唤醒后ADC需要重新配置channel

在蓝牙和触摸工程中注意

1.当与蓝牙工程或者触摸功能联合使用时候,要注意adc的使用必须与蓝牙的内部温度校准函数/触摸采样函数 优先级一致,或者说脚顺序执行,否则对优先级低的操作就要加原子操作,避免在高优先级的打断低优先级的ADC 操作导致采样结果混乱甚至死机之风险.
2,在不清楚优先级的情况下,可以粗暴的在ADC采样的时候屏蔽全局中断,使用完后再打开.

其他

使用ADC做随机数的种子

void set_srand_use_adc(void) {
    uint16_t num =0;
    ADC_InterTSSampInit();
    for(uint32_t i = 0; i < 16; i++) {
        num <<=1;
        num  |= ADC_ExcutSingleConver()&0x1;
    }
    srand(num);
    ADC_DisableTSPower();
    //PRINT("num:%d\n",num);
}
posted on 2021-01-20 20:27  iot-fan  阅读(1432)  评论(0编辑  收藏  举报