一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种提高A/D转换精度的电路的制作方法

2022-02-20 12:43:54 来源:中国专利 TAG:

一种提高a/d转换精度的电路
技术领域
1.本发明涉及a/d转换领域,具体涉及一种提高a/d转换精度的电路。
2.

背景技术:

3.在实际电子产品开发中a/d转换器是会被经常使用到的器件,但是一定位数的a/d转换器其转换精度也是一定的。随着电子技术的发展,mcu都会集成有a/d转换器和d/a转换器,通常这种自带的a/d转换器精度会比较低12位或者16位。当我们需要更高精度转换时要换高精度的a/d转换器,高位数的a/d转换器成本较高。
4.

技术实现要素:

5.本发明所要解决的技术问题是提供一种提高a/d转换精度的电路,其相对更换高精度的a/d转换器更加节约成本。
6.本发明解决上述技术问题的技术方案如下:一种提高a/d转换精度的电路,包括第一级运放a和第二级运放b;所述第一级运放a的正向输入端通过电阻r1连接待a/d转换的模拟电压vin,所述第一级运放a的正向输入端还通过电阻r2接地,所述第一级运放a的负向输入端通过电阻r3连接mcu中d/a输出的模拟电压vref,所述第一级运放a的负向输入端还通过电阻r4连接所述第一级运放a的输出端,所述第一级运放a的vcc端接电压vcc,所述第一级运放a的vee端接电压vee;所述第一级运放a的输出端连接所述第二级运放b的正向输入端,所述第二级运放b的负向输入端通过电阻r5连接所述第二级运放b的输出端,所述第二级运放b的负向输入端还通过电阻r6接地,所述第二级运放b的输出端连接mcu的a/d转换输入端。
7.在上述技术方案的基础上,本发明还可以做如下改进。
8.进一步,所述第二级运放为同向运算放大器。
9.进一步,当r1=r2=r3=r4时,所述第二级运放b的正向输入端的输入电压vi= vin-vref。
10.进一步,所述第二级运放b的输出端vout=vi(r5 r6)/r6。
11.进一步,通过调节电阻r5和电阻r6的阻值实现调节第二级运放的放大倍数,放大增益g = (r5 r6)/r6。
12.本发明的有益效果是:本发明一种提高a/d转换精度的电路通过两级运放,并在电阻r1至电阻r6的配合下,可以提高a/d转换器的精度,其相比于更换高精度的a/d转换器更加节约成本。
附图说明
13.图1为本发明一种提高a/d转换精度的电路的电路结构示意图。
14.具体实施方式
15.以下结合附图对本发明的原理和特征进行描述,所举实例只用于解释本发明,并非用于限定本发明的范围。
16.如图1所示,一种提高a/d转换精度的电路,包括第一级运放a和第二级运放b;所述第一级运放a的正向输入端通过电阻r1连接待a/d转换的模拟电压vin,所述第一级运放a的正向输入端还通过电阻r2接地,所述第一级运放a的负向输入端通过电阻r3连接mcu中d/a输出的模拟电压vref,所述第一级运放a的负向输入端还通过电阻r4连接所述第一级运放a的输出端,所述第一级运放a的vcc端接电压vcc,所述第一级运放a的vee端接电压vee;所述第一级运放a的输出端连接所述第二级运放b的正向输入端,所述第二级运放b的负向输入端通过电阻r5连接所述第二级运放b的输出端,所述第二级运放b的负向输入端还通过电阻r6接地,所述第二级运放b的输出端连接mcu的a/d转换输入端。
17.在本发明中:vref是mcu的d/a输出的模拟电压, vin是要进行的a/d转换的模拟电压。当r1=r2=r3=r4时,所述第二级运放b的正向输入端的输入电压vi= vin-vref;所述第二级运放为同向运算放大器,所述第二级运放b的输出端vout=vi(r5 r6)/r6;通过调节电阻r5和电阻r6的阻值实现调节第二级运放的放大倍数,当r5=100k,r6 = 1k时,放大增益g = (r5 r6)/r6;这时vout=vi*g。
18.以下是以stm32f1xx系列的mcu为例实现提高a/d转换器精度的实现步骤可分为如下:设置d/a值为 000h; dac_setchannel1data(dac_align_12b_r, 000h);读取a/d的转换值存放ad_value=adc_getconversionvalue(adc1);根据ad_value的值来调节 d/a的值, 实现方法如下:#define
ꢀꢀ
ad_value_ulimit
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
(0xfff
ꢀ–ꢀ
200)#define
ꢀꢀ
ad_value_dlimit
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
200#define
ꢀꢀ
da_value_max
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
0xfff#define
ꢀꢀ
da_value_min
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
0x000unsigned short da_value,
ꢀꢀ
ad_value;void autosetda_value(void){
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
unsigned short
ꢀꢀ
i, offset;da_value = da_value_min;offset = da_value_max ;dac_setchannel1data(dac_align_12b_r, da_value);
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
ad_value = adc_getconversionvalue(adc1);
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
for(i = 0;
ꢀꢀ
i 《 12;
ꢀꢀ
i ){
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
offset
ꢀꢀ
=
ꢀꢀ
offset / 2
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
if(ad_value 》= ad_value_ulimit)
{
ꢀꢀꢀꢀꢀꢀꢀꢀ
da_value = da_value offset;}else if (ad_value 《= ad_value_dlimit){
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
if(da_value 《= da_value_min){
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
break;}
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
da_value = da_value
ꢀ-ꢀ
offset;
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
if(da_value 《= da_value_min){ da_value = da_value_min;}}else{
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
break;}dac_setchannel1data(dac_align_12b_r,da_value);
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
ad_value = adc_getconversionvalue(adc1);}}最终的采集模拟电压为:vin = vdda * (da_value / fffh ad_value / fffh / g); 此时有采集电压精度远远大于12位a/d转换精度。
19.在上述程序中:ad_value_ulimit 为定义ad 值的允许上限值ad_value_dlimit 为定义ad 值的允许下限值da_value_max 为定义da设定的上限值da_value_min 为定义da设定的下限值da_value和ad_value 定义两个变量,da_value用来存放da要设置的值,ad_value用来存放读取的ad值/**函数名:
ꢀꢀ
autosetda_value功能: 通过读取的ad_value, 正调整da设定值 da_value,当ad_value 能在 ad_value_ulimit 与 ad_value_dlimit之间,*/void autosetda_value(void){
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
unsigned short
ꢀꢀ
i, offset;
ꢀꢀ
/* 定义局部变量 i, offset
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
*/da_value = da_value_min; /*对变量da_value赋初值*/offset = da_value_max ;
ꢀꢀꢀ
/*对变量offset赋初值
ꢀꢀꢀ
*/
dac_setchannel1data(dac_align_12b_r, da_value);/*将da的值设置到da_value */
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
ad_value = adc_getconversionvalue(adc1); /*读取ad值存放到ad_value */
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
for(i = 0;
ꢀꢀ
i 《 12;
ꢀꢀ
i ) /* 因为是12位da,ad所以采用二分法最多循环12次就可以找到合适的da_value
ꢀꢀ
*/{
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
offset
ꢀꢀ
=
ꢀꢀ
offset / 2
ꢀꢀ
/* 需要调整的量减半 */
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
if(ad_value 》= ad_value_ulimit){
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
/* 如果ad_value值大于等于
ꢀꢀ
ad_value_ulimit时
ꢀꢀ
*/
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
da_value = da_value offset; /* da_value值要增加offset
ꢀꢀ
*/}else if (ad_value 《= ad_value_dlimit){
ꢀꢀꢀꢀꢀꢀ
/* 如果ad_value值小于等于
ꢀꢀ
ad_value_ulimit时
ꢀꢀ
*/
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
if(da_value 《= da_value_min){
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
/* 当da_value值已经是最小值 da_value_min时就不用再向下调整da值了要退出循环
ꢀꢀ
*/
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
break;}
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
da_value = da_value
ꢀ-ꢀ
offset;/* da_value值要减去offset
ꢀꢀ
*/
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
if(da_value 《= da_value_min){ da_value = da_value_min;/* 做异常处理,防止da_value值比da最小值da_value_min小
ꢀꢀꢀ
*/}}else{ /* 当ad_value值在 ad_value_ulimit ad_value_dlimit之间时说明不用调整da_value,退出循环 */
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
break;}dac_setchannel1data(dac_align_12b_r,da_value);/* 重新设置da的值 为da_value */
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
ad_value = adc_getconversionvalue(adc1); /*重新读取ad值存到ad_value
ꢀꢀ
*/}}本发明一种提高a/d转换精度的电路通过两级运放,并在电阻r1至电阻r6的配合下,可以提高a/d转换器的精度,其相比于更换高精度的a/d转换器更加节约成本。
20.以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献