请问adc与pwm的关系。还有做开关稳压电源的时候这两个怎么用上的?

请问adc与pwm的关系。还有做开关稳压电源的时候这两个怎么用上的?,第1张

是ADC,不是DAC。

ADC与PWM是这样建立关系的:

检测到输出的电压变化,由ADC将输出的模拟的变化量转换为数字量,然后这个数字量给予单片机,单片机检测到这个数字量,再去改变程序的PWM参数,单片机的I/O去驱动MOS的PWM就发生相应变化。

这个是数字电源的范围,用单片机控制MOS的开关状态。

提交回答

1. 说明

对于没有ADC的主控芯片来说,如果要实现ADC的功能,可以用两个GPIO和一个运算放大器解决该问题。对于某些国产芯片来说,其内部没有ADC,所以在有些方案上采用的是PWM电路进行模拟电压的测量。接下来逐步分析一下基本的原理与采集过程。

2.基本原理

利用积分电路,通过调节PWM的占空比,将PWM变成平滑的电压输出。然后与需要测量的电压用比较器进行比较。不断调节PWM的占空比,当比较器的输出从0到1时,正好变化时,记录当前的PWM的占空比即可实现模拟电压的测量。

2. 硬件原理图

2.1 积分电路

该部分电路的作用主要是将PWM波转换成一个平滑的直线。

由于电容两端的电压不能突变,这里采用三阶积分电路,使得输出到比较器的电压是一个平滑的直流电压。

计算公式

经过仿真后效果如下:

输入为100K,振幅为3.3V的PWM波。当占空比为70%时,此时的输出波形为一个平滑的直流电压,根据计算公式,得到理论值为2.31V与仿真得到的2.325V基本保持一致。

2.2 电压比较器

这部分电压是电压比较器的电路原理图,其中R6的作用是上拉电阻,提高运放的输出能力。

通过R4与R5两个电阻进行分压。得到测量电压的三分之一与PWM调节出来的电压进行比较。通过连续不断的条件PWM的占空比,并检测运放的输出,当功放输出电平出现正好反向时,此时的运放的正级输入就可以认为与三分之一的测试电压相同。通过该原理得到需要测量电压的值。

3. 软件设计

对于PWM测量电压,需要gpio能够输出PWM波。可以直接用gpio输出高低电平,然后通过计算占空比来进行调节。对于君正X1000来说,可以直接利用PWM输出稳定的波形。

然后在比较器输出引脚,可以将该引脚设置成一个中断,当中断发生时,功放的电平发生翻转。通过得到当前的PWM占空比,从而计算出此时电池的电量。

代码可以参考

kernel/drivers/power/pwm-battery.c

通过该方法测量得到的电压不是很准确,代码中的默认精度为50mV。如果要调节精度,可以修改以下代码

#define PWM_FREQ (140 * 1000)//采样频率#define PWM_STABLE_TIME_US 200#define PWM_SAMPLE_TIMES 3//采样次数#define PWM_DUTY_NS_STEP 30//每次调节PWM采样时间

4. 总结

在没有ADC的情况下,可以利用两个GPIO和一个功放进行模拟ADC的设计。

(1)该方法需要输出一个稳定的PWM波,其占空比需要精确,所以能够产生一个稳定的PWM波是关键。

(2)被测量的电压需要稳定,所以为了其电压的稳定,可以在需要测量的电路部分加一个电容。

增加电容C162可以让电平更加的平稳,采集的电压更加精确。

(3)可多次ADC转换求平均值,进行数字滤波消除误差。

AD值是 0--255 取AD值来做PWM的脉宽,同时 波形周期不变。

取反加1相当于 256-AD,也就是说 PWML+PWMH=256

AD只是影响PWMH与PWML间的比例,波形的周期一直是 256*指令周期

主程序中的死循环部分

while(1)

{

ST=0

ST=1

ST=0

while(EOC==0)

OE=1

ADC=P1

OE=0

PWML=ADC

PWMH=0-ADC

}

//中断程序

void int_t0() interrupt 1

{

if(PWM)

{

PWM=0

TH0=PWML

TL0=PWML

}

else

{

PWM=1

TH0=PWMH

TL0=PWMH

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11284204.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存