ШИМ на Atmega32 и Atmega48\168PA. В чем отличия?
Добавлено: Пн июн 05, 2017 18:29:36
Всем здравствуйте. Я новичок, изучаю микроконтроллеры. У меня есть Atmega32, на которой я делаю свои опыты, и все хорошо. Недавно приобрел Atmega168PA (он на плате клона Arduino Pro Mini 5v), и решил попробовать поработать с аппаратным ШИМ на нем, но не получается, нога не выдает требуемое напряжение. Цеплялся мультиметром к каждой ноге, которая может давать ШИМ (смотрел по даташиту), не понимаю, не работает. Заметил одну вещь, что ноги OCxx на МК Atmega32 имеют только одно назначение (по схеме), а вот на Atmega48 и Atmega168PA на ноге OC2A, к примеру, есть еще и MOSI и PCINT3, слышал, что чтобы подать ШИМ на ногу, надо через фьюзы это сконфигурить. Требуемый фьюз не нашел, либо это делается не так
Но шим не работает, вот код (пробовал на Atmega48 и 168PA):
подскажите, что делаю не так? Спасибо.
Код: Выделить всё
#define F_CPU 8000000UL // atmega48 8 MHz
#include <avr/io.h>
#include <util/delay.h>
#define msleep _delay_ms
void pwm_init()
{
// switch off voltage on every D and B ports
PORTB = 0x00;
PORTD = 0x00;
// enable PD5, PD6, PD3 and PB3 for PWM output
DDRB = 0x08;
DDRD = 0x68;
// setup timers for hardware pwm
TCCR0A |= (1 << COM1B1) | (0 << COM1B0) | (1 << WGM10) | (0 << WGM11) | (1 << COM1A1) | (0 << COM1A0);
TCCR0B |= (1 << WGM12) | (0 << WGM13) | (1 << CS10);
TCCR2A |= (1 << COM1B1) | (0 << COM1B0) | (1 << WGM10) | (0 << WGM11) | (1 << COM1A1) | (0 << COM1A0);
TCCR2B |= (1 << WGM12) | (0 << WGM13) | (1 << CS10);
}
int main(void)
{
pwm_init();
while(1)
{
OCR0A = OCR0B = OCR2A = OCR2B = 0x00;
msleep(1000);
OCR0A = OCR0B = OCR2A = OCR2B = 0x3F;
msleep(1000);
OCR0A = OCR0B = OCR2A = OCR2B = 0x7F;
msleep(1000);
OCR0A = OCR0B = OCR2A = OCR2B = 0xFF;
msleep(1000);
}
return 0;
}