【ESP32-C3-DevKitM-1】ESP32-C3的ADC
[复制链接]
ADC的评测
ESP-C3的ADC有两个,5通道的已校准的ADC1和1通道的未校准的ADC2,采样速率为200Ksps,DHL和INL分别为±7LSB和±12LSB,只能说达到了够用的级别。
按照之前的方法,新建一个工程,添加模板,如下图,然后编译运行
这里要注意一点,选择模板的时候要选择esp32-c3中的adc例程,而不是single-read中的adc例程。
例程中包含用DMA传输数据和普通的,我接下来是测试普通的ADC采样。
我稍微改动了一下ESP-IDF提供的例程,这样更好讲,如下图
我讲一下基本流程。
- adc1_config_width(ADC_WIDTH_BIT_12); 这句为配置ADC1的位数,可为9-12位
- adc1_config_channel_atten(ADC1_CHANNEL_4, ADC_ATTEN_DB_11);这句是配置通道和衰减数,通道4的话对应的就是GPIO4,adc_atten_t衰减系数有4种,相对应有4种不同的电压测量范围,如下图,所以要选择合适的系数
- 要进行电压校准
adc_chars = calloc(1, sizeof(esp_adc_cal_characteristics_t));
esp_adc_cal_characterize(ADC_UNIT_1,ADC_ATTEN_DB_11, ADC_WIDTH_BIT_12, 1100, adc_chars);
首先先用calloc申请一段内存,然后调用esp_adc_cal_characterize API,具体的输入参数可以看API介绍,其中第四个参数是默认的参考电压,ESP32-C3的参考电压为1100mv,但是我发现一个问题,第四个参数其实填什么数字都可以,比如0mv或者3300mv,并不会影响其结果。
- 进行读取ADC原始数值
adc_reading= adc1_get_raw(ADC1_CHANNEL_4);
- 进行数据转换
这里本来我是想用以前的ADC数值转换的思想,就是原始数据直接乘上一个系数,后来发现数据相差较大,经过询问官方技术后,得知要用esp_adc_cal_raw_to_voltage(adc_reading, adc_chars);转换为真实数据,因为还需要引入存有校准数据的adc_chars,最后打印出来
实际测试
精度还是能接受的,可能输入DC-DC电源也有一些影响。
还有一点,最好不要超推荐量程工作,比如在衰减11db时,ADC最高能测3000mv左右,推荐为2600mv,当越到后面差的越大,可能有50-100mv的误差。
|