QZDZ 发表于 2007-5-24 16:18:05

用PWM和比较器来实现ADC

前天,我看到本网站上有个关于充电器的帖子,里面提到所用AVR的片的ADC才10位,怎么可以实现1mV的分辨率。

我想可以通过这样的方案来解决,用PWM部分产生16位的PWM,然后滤波后输入比较器的一端,检测信号输入比较器的另外一端。通过改变占空比来改变比较器一端的电压,与输入信号进行比较就可以实现了。

我想,用这种方法实现11位甚至12位精度的ADC应该问题不大。

当然,应该也有一些东西会影响精度和响应速度的。

如:

1.用于产生PWM的电源的精度

2.滤波的时间常数,直接影响响应速度

3.比较器的失调电压等

……

估计还有一些影响的,希望大家讨论补充,并提出解决方案。

I_user_AVR 发表于 2007-5-24 16:28:17

算是一个办法了:



我试过用AVR输出16位的PWM,PWM频率好像是1K还是多少,忘了。

PWM经三阶RC滤波后,电压值相当稳定了,当然有个前提,你的AVR供电也要非常好。

QZDZ 发表于 2007-5-24 16:48:59

另外,一种麻烦点,但可以减少与AVR单片机共用电源的干扰

将AVR的PWM脚去控制4053这样的开关,模拟开关的中点为输出,开关的两端,一端电源,一端地。

当然,这后面的供电应该是干净、稳定的。

QZDZ 发表于 2007-5-24 16:51:10

还有就是,滤波时间常数的选择是关键,应该这个既影响响应,又影响精度。



当然,提高PWM的频率,可以减小滤波时间常数,当然也就提高了速度。

CHXUEAVR 发表于 2007-5-24 17:25:46

不好意思,楼主占用你一下空间啊!问个问题

我想实现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

没有错呀,错在哪一位?

zhpowerpcb 发表于 2007-5-25 12:37:43

楼上的也霸道了,

不过我帮一下4楼的,你把这句话从新写一下,就对了

   OUTTCCR1A,TEMP1 ;比较A输出模式,脉宽调制PWM1A使能

你仔细看看,你的标点与下面的标点有啥不一样.

CHXUEAVR 发表于 2007-5-25 12:45:09

哎呀,真是这样的.太历害了,现在可以了,

怪了,一个标点会影响出现错误吗.怪事.

lyl520719 发表于 2013-5-22 06:54:37

用FPGA实现PWM精度会更高。

mtswz.213 发表于 2013-5-22 07:50:00

pwm的精度能好到哪去,能做到10bit就很好了!

millwood0 发表于 2013-5-22 08:21:47

You don't even need to use the pwm -> a comparator + digital io = 1-bit adc.
页: [1]
查看完整版本: 用PWM和比较器来实现ADC