我正在使用MPC 7555控制器。它有一个16位sigma delta ADC。 称为麦克风输入的信号被馈送到该ADC引脚。根据电压,应生成相同频率的ADC信号采样的PWM信号。
For e.g.
0.1 V = 2 percent
0.2 V = 4 percent
0.3 V = 6 percent....and so on
So, i thought the following logic -
5V - 0xFFFF in digital
0.1V - 1310
0.2V - 2620 and so on
因此,将数字值除以655将给出精确的占空比值
1310/655 = 2
2620/655 = 4........
但是数字引脚也可以在0.1 V时显示1309的值,除以655将产生1而不是2。
无论如何,我可以避免这种情况或有任何更好的解决方案,请分享。
答案 0 :(得分:0)
任务是以与ADC转换速率相同的速率输出PWM。
假设ADC转换时间为T(您可以通过读取自由运行定时器计数器来建立此时间)。并且假设ADC转换值为V.那么花费“高”的PWM输出时间H
必须
H = T * V / 0xFFFF
每次ADC转换可用时,您(取消任何待处理的单次定时器中断和)都会将PWM输出设置为1并在时间H
触发单次定时器。当它中断时,将PWM输出设置为0(或者如果你有反逻辑则反过来)。
如果输入为0x0000
或0xFFFF
,您可以采用替代策略 - 将输出设置为0或1,但不要部署一次性计时器。
答案 1 :(得分:0)
为了获得PWM信号的最佳保真度,您最好直接在PWM的分辨率下工作,而不是仅计算百分比,然后将其转换为PWM计数。使用整数百分比,您实际上将分辨率限制为每个样本6.64位(即log 10 (100)/ log 10 (2))。
所以假设你的每个周期的PWM计数是PWM_MAX,你的ADC最大ADC_MAX,那么PWM高周期将是:
pwm_high = adc_val * PWM_MAX / ADC_MAX ;
首先执行乘法以避免信息丢失很重要。如果PWM_MAX足够高,则可能不需要担心整数除法向零舍入而不是最接近的整数,但如果这是一个问题(对于低PWM_MAX),那么:
pwm_high = ((adc_val * PWM_MAX) + (ADC_MAX / 2)) / ADC_MAX ;
例如,大豆你的PWM_MAX只有100(即分辨率真的是整数百分比),那么在第一种情况下:
pwm_high
= 1310 * 100 / 0xFFFF = 1
在第二个:
pwm_high
=((1310 * 100)+ 0x7FFF)/ 0xFFFF = 2
然而,如果PWM_MAX可能更适合4096,那么:
pwm_high
= 1310 * 4096 / 0xFFFF = 81
或
pwm_high
=((1310 * 4096)+ 0x7fff)/ 0xFFFF = 82
当PWM_MAX为4096时,您可以有效地获得12位分辨率,并且可以保持更高的保真度以及直接计算正确的PWM值。