完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
最重要的公式
要记住ADC测量结果无非就是一个代表电压量的值,管脚上的模拟信号转换为12位二进制数据(0xFFF),例如:如果参考电压是5V,ADC输入也是5V,那ADC转换结果就是0xFFF;如果参考电压是5V,ADC输入是2.5V,那ADC转换结果就是0xFFF除以2。ADC转换结果除以满量程ADC值(即0xFFF)就是与参考电压的比例,这个比例乘以参考电压就是实际电压值(Vain)。 计算代码如下: // CN Spec, 18.1.1, P193, ADC_DATA = 4095 * (Vain/Vref) // So: Vain = (ADC_DATA * Vref) / 4095, Vref is 'VDD voltage' adc_mgnts[ch].vol = ((adc_mgnts[ch].aver_adc_data * Vref_vol) / 0xFFF); 怎么得到参考电压Vref? Vref可以通过计算获得,或者测量得到。 要求不高可以直接用万用表量管脚pin9,即Vdd的电压(我直接测到就是接近5V),后面计算参考电压的就不用看了。 计算参考电压Vref的方法见下面代码,其实官方例程里用ADC测量VDD的代码。 先计算Band-gap(见中文spec例程P195),再用读取到的Band-gap值通过ADC计算VDD值(见中文spec例程P196) // CN Spec, 18.1.4, P196, VDD voltage Vref_vol = ((0xFFF * Bandgap_Voltage) / adc_mgnts[(ADC_CH_BAND_GAP)].aver_data); 温度传感器LM50计算温度 上面的ADC转换得到电压值后,通过公式得到温度值。为了方便传输,并提高温度精度到0.01摄氏度,这里用到了modf函数提取double类型的整数部分,得到的结果除以100即是摄氏度。 #include #define TEMP_REAL_DATA_MULtiPLE_NUM 100 /* get VDD volume value, unit is 0.01℃ */ int get_temp_value_by_adc_data(double adc_data) { double out; double f; double big_adc_data; int vol_mV = 0; /* T = (VO - 500 mV) / 10 mV/℃ */ big_adc_data = (((adc_data) - 500.0) / 10); big_adc_data *= TEMP_REAL_DATA_MULTIPLE_NUM; f = modf(big_adc_data, &out); vol_mV = (int)out; #if (defined DEBUG_MSG) && (defined EN_ADC_COMPUTE_DEBUG) printf("ADC: temp value fmod %e =%f, real out=%e(%d)"CRLF, adc_data, f, out, vol_mV); #endif return vol_mV; } |
|
相关推荐
1个回答
|
|
To obtain the reference voltage Vref, it can be either set by the user or provided by the microcontroller's datasheet. In some microcontrollers, Vref is a fixed internal voltage typically around 1.1V or 2.56V, while in others, it can be externally connected to a Vref pin.
The formula to calculate the actual voltage (Vain) from the ADC reading is: Vain = (ADC_DATA * Vref) / 4095 where ADC_DATA is the ADC reading and Vref is the reference voltage. The result is then stored in the variable adc_mgnts[ch].vol. |
|
|
|
只有小组成员才能发言,加入小组>>
3309 浏览 9 评论
2988 浏览 16 评论
3490 浏览 1 评论
9050 浏览 16 评论
4085 浏览 18 评论
1171浏览 3评论
602浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
594浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2331浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1894浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-20 11:47 , Processed in 0.970068 second(s), Total 47, Slave 38 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号