0

我有一段代码可以在输出比较模式下使用快速 pwm 从 PB4 和 PB5 获得相同的模拟 pwm 输出电压。然而,它们的电压是不同的。这可能是什么原因?此外,两个引脚的电压都不接近 1.23 V,这应该是输出电压。

这是代码。

#include <`avr/io.h`>

#include <`avr/interrupt.h`>

ISR(TIMER0_COMP_vect)
{
    cli();
    PORTB &= ~(1<<PB5);
    sei();
}


ISR(TIMER0_OVF_vect)
{
    cli();
    PORTB |= (1<<PB5);
    sei();
}

void init(void)
{
    TCCR0 |= (0<<FOC0)|(1<<WGM01)|(1<<WGM00)|(1<<COM01)|(1<<COM00)|(1<<CS02)|(1<<CS01)|(1<<CS00);
    OCR0 = 63;
    TIMSK |= (1<<OCIE0)|(1<<TOIE0);
}


int main(void)
{
    DDRB = 0xFF;
    PORTB = 0xFF;
    init();
    sei();
    while(1);
}
4

1 回答 1

1

首先,如果您使用的是 ATMega328p 之类的东西,设置所有三个 CS 位将启用外部时钟源,而不是使用内部时钟,因此计时器不会运行(除非您确实有外部计时器时钟来源)。根据您使用的微控制器,确保这些位启用特定的预分频器值。

其次,由于您的测量方法和 PWM 的实际工作方式,您也可能会遇到问题。尽管在处理 Arduinos 时它经常被列为模拟输出,但脉冲宽度调制实际上正如它所说的那样 - 它在地和 VCC(可能是 5V)之间快速切换数字输出,具有不同的占空比。如果在示波器上查看其中一个输出引脚,它可能会显示某种形式的方波。 在此处输入图像描述

使用万用表测量时,您看到的值将是输出高或低时采集的样本组合,可能是这些随机定时样本的平均值,因此是意外读数。

为了得到你想要的结果,你真的需要平滑数字输出。简而言之,这通常通过一个低通滤波器来完成,该滤波器由连接到输出引脚的电阻器和电容器组成。 在此处输入图像描述

这是通过使用方波在电阻为高时通过电阻器为电容器充电,并在其为低时对其进行放电来实现的。通过使高电平时间多于低电平时间(更长的占空比),电容器稳定在更高的电压(反之亦然)。电阻器限制从 AVR 输出引脚汲取的电流(就好像电容器处于 0V 并且输出被驱动为高电平一样,您实际上是在瞬间将输出短接到地)。

对于您的情况,4.7K 左右的电阻和 2uf 左右的电容器可能适合。增加电容或电阻以减少纹波。

于 2014-02-04T02:29:48.407 回答