用PWM和比较器来实现ADC
前天,我看到本网站上有个关于充电器的帖子,里面提到所用AVR的片的ADC才10位,怎么可以实现1mV的分辨率。我想可以通过这样的方案来解决,用PWM部分产生16位的PWM,然后滤波后输入比较器的一端,检测信号输入比较器的另外一端。通过改变占空比来改变比较器一端的电压,与输入信号进行比较就可以实现了。
我想,用这种方法实现11位甚至12位精度的ADC应该问题不大。
当然,应该也有一些东西会影响精度和响应速度的。
如:
1.用于产生PWM的电源的精度
2.滤波的时间常数,直接影响响应速度
3.比较器的失调电压等
……
估计还有一些影响的,希望大家讨论补充,并提出解决方案。 算是一个办法了:
我试过用AVR输出16位的PWM,PWM频率好像是1K还是多少,忘了。
PWM经三阶RC滤波后,电压值相当稳定了,当然有个前提,你的AVR供电也要非常好。 另外,一种麻烦点,但可以减少与AVR单片机共用电源的干扰
将AVR的PWM脚去控制4053这样的开关,模拟开关的中点为输出,开关的两端,一端电源,一端地。
当然,这后面的供电应该是干净、稳定的。 还有就是,滤波时间常数的选择是关键,应该这个既影响响应,又影响精度。
当然,提高PWM的频率,可以减小滤波时间常数,当然也就提高了速度。 不好意思,楼主占用你一下空间啊!问个问题
我想实现PB1(OC1A)脚输出PWM,采用溢出方式,可出现错误,不知错在哪里,请大家指示.
//*************************************
// 定时器/计数器(T/C1)溢出中断使能初始化
//*************************************
LDITEMP1,0X04
OUTTIMSK,TEMP1 ;T/C1溢出中断使能(TOIE1=1)
OUTTIFR,TEMP1 ;T/C1溢出标志位(TOV1=1)
//********************************
//定时/计数器中断(T/C1)初始化
//*******************************
LDITEMP1,0XC2
OUTTCCR1A,TEMP1 ;比较A输出模式,脉宽调制PWM1A使能
LDITEMP1,0X88
OUTTCCR1B,TEMP1 ;T/C1预分频CK/128
LDITEMP1,80
OUTOCR1A,TEMP1;T/C1计数计到OCR1A时产生比较匹配
LDITEMP1,156
OUTOCR1C,TEMP1;T/C1计数计到OCR1C时产生比较匹配
LDITEMP1,0X00 ;4.0M/256/156=100HZ
OUTTCNT1,TEMP1;初始值从0X00上向计数,计到OCR1C时匹配,溢出,从$00重新开始
错误在这里:D:\练习汇编\TN26中断\TN26中断.asm(86): error: Invalid character: '? (0xa3)
D:\练习汇编\TN26中断\TN26中断.asm(86): error: Invalid character: '? (0xac)
D:\练习汇编\TN26中断\TN26中断.asm(86): error: syntax error, unexpected INTEGER
错误的这一行是:LDITEMP1,0XC2
OUTTCCR1A,TEMP1 ;比较A输出模式,脉宽调制PWM1A使能TEMP1=R16
没有错呀,错在哪一位? 楼上的也霸道了,
不过我帮一下4楼的,你把这句话从新写一下,就对了
OUTTCCR1A,TEMP1 ;比较A输出模式,脉宽调制PWM1A使能
你仔细看看,你的标点与下面的标点有啥不一样. 哎呀,真是这样的.太历害了,现在可以了,
怪了,一个标点会影响出现错误吗.怪事. 用FPGA实现PWM精度会更高。 pwm的精度能好到哪去,能做到10bit就很好了! You don't even need to use the pwm -> a comparator + digital io = 1-bit adc.
页:
[1]