2015-09-11 36 views
0

我正在使用MPC 7555控制器。它有一个16位Σ-Δ型ADC。 一个称为麦克风输入的信号被馈送到该ADC引脚。基于该电压,应该生成具有相同频率的ADC信号采样的PWM信号。基于Mic输入的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划分将产生1而不是由655将数字值将给出精确的占空比值的1309

1310/655 = 2 
2620/655 = 4........ 

但是数字销也可以显示值0.1V时,其2.

无论如何,我可以避免这一点,或有任何更好的解决方案,请分享。

+0

伙计任何帮助,请 – gabbar

+0

耐心 - 世界上不是每个人都在你的时区,24小时是一个好时机,然后想知道为什么你没有答案,即使这样你应该考虑你的问题是否需要改进而不是恳求回应。只有那些编辑过你的问题或已经评论过的人可能在任何情况下都会收到你的评论的通知, – Clifford

回答

0

任务是以与ADC转换速率相同的速率输出PWM。

假设ADC转换时间是T(您可以通过读取自由运行定时器计数器来确定此时间)。并假设ADC的转换价值为V.那么PWM输出时间H花“高”必须是

H = T * V/0xFFFF 

每次ADC转换是可用的,你(取消所有待单次计时器中断和)设置PWM输出为1,并在H时刻触发一次性定时器。当它中断时,将PWM输出设置为0(或者如果您有反逻辑,则反过来)。

如果输入是0x00000xFFFF您可以采用替代策略 - 将输出设置为0或1,但不要部署单次计时器。

+0

对你的回答有很大的影响 – gabbar

+0

我对此比较陌生。请让我知道为什么一次拍摄计时器设置必须完成。将真的很感激 – gabbar

+0

@ gabbar也许你的控制器有PWM输出功能 - 我没有看。我的评论是当使用一个没有的控制器时。然后,您需要一种在占空比正确的时刻更改输出的方法,这将随每个(不同的)读数而变化。 –

0

为了获得PWM信号的最佳保真度,您最好直接在PWM的分辨率下工作,而不是仅计算一个百分比,然后将其转换为PWM计数。使用整数百分比,可以有效地将分辨率限制为每个样本6.64位(即,日志记录为012)

所以我们可以说每个周期的PWM计数PWM_MAX,和你的ADC最大ADC_MAX,然后将PWM高发期将是:

pwm_high = adc_val * PWM_MAX/ADC_MAX ; 

首先执行乘法,以避免信息的损失是很重要的。如果PWM_MAX是suficiently高,有可能是没有必要担心的整数除法向零舍入而不是到德最接近的整数,但如果这是一个问题(低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值。

+0

感谢克利福德你的答案,真的很感激它。在我的情况下,输入到hw寄存器的100%占空比值是0x8000,adc是15位而不是16位,如上所述。所以你提出的第一次溶出就可以了。也就是说,如果接收到的数字值是当时的占空比=(a * 0x8000)/ 0x7FFF。请纠正,如果我错了 – gabbar

+0

@gabbar:这个问题实际上指定了一个16位ADC,但不管。许多ADC可以选择将结果左移,以使MSB为0x8000。这允许代码被写入16位,而不管实际的ADC分辨率如何,使代码更加便携。您可以将软件中的换档应用于不支持它的硬件。 – Clifford