Страница 1 из 1

Шесть ШИМ каналов. Atmega48/168.

Добавлено: Пн окт 16, 2017 08:52:24
7seg
Дня всем доброго , в очередной раз столкнулся с проблемой настройки таймеров. Прошу вашей помощи.

Пытался выставить настройки по
http://www.atmel.com/images/Atmel-7530- ... asheet.pdf

Где все таки косяк ?
ШИМы должны работать на одинаковой частоте. но с возможность изменения скважности.

Код: Выделить всё

#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
void init_pwm()
{
	/**ШИМ 1-2**/
	TCCR0A=(1<<COM0A1)|(0<<COM0A0)|(1<<COM0B1)|(1<<COM0B0)|(1<<WGM01)|(1<<WGM00);
	TCCR0B=(1<<WGM02)|(0<<CS02)|(1<<CS01)|(0<<CS00);
	OCR0A=0x00;	 
	OCR0B=0x00;	
	/**ШИМ 3-4**/
	TCCR1A=(1<<COM1A1)|(0<<COM1A0)|(1<<COM1B1)|(0<<COM1B0)|(0<<WGM11)|(1<<WGM10);
	TCCR1B=(0<<WGM13)|(1<<WGM12)|(0<<CS12)|(1<<CS11)|(0<<CS10);
	OCR1A=0x00;
	OCR1B=0x00;
	/**ШИМ 5-6**/
	TCCR2A=(1<<COM2A1)|(0<<COM2A0)|(1<<COM2B1)|(0<<COM2B0)|(1<<WGM21)|(0<<WGM20);
	TCCR2B=(1<<WGM22)|(0<<CS22)|(1<<CS21)|(0<<CS20);
	OCR2A=0x00;
	OCR2B=0x00;
}
int main(void)
{
	int i=0;
	DDRB =0xFF;
	PORTB=0x00;
	DDRC=0xFF;
	PORTC=0x00;
	DDRD=0xFF;
	PORTD=0x00;
	init_pwm();
    while(1)
    {
		for (i=0;i<255;i++)		//Плавно повышаем 
		{
		_delay_ms(50);
		OCR0A++;
		OCR0B++;
		OCR1A++;
		OCR1B++;
		OCR2A++;
		OCR2B++;
		}
		for (i=0;i<255;i++)		//Плавно понижаем 
		{
		_delay_ms(50);			
		OCR0A--;
		OCR0B--;
		OCR1A--;
		OCR1B--;
		OCR2A--;
		OCR2B--;
		} 
    }
	return 0;
}

Re: Шесть ШИМ каналов. Atmega48/168.

Добавлено: Пн окт 16, 2017 09:28:02
BOB51
Вообще-то на одном таймере получится только одноканальный полноценный ШИМ с произвольной частотой... разве что на Т/С1...
Ежли речь о двух независимых значениях в OCRхх... при периоде на ICRn... (доступно только для Т/С1)... То прерывания от них точно будут, а вот насчет аппаратной увязки с выводами весьма вчитываться надо...
Да и Т/С0 Т/С2 у 48/168 лишены своего ICRn...
Посему частота ВСЕХ будет определяться частотой переполнения Т/С0=Т/С2
:dont_know:

Re: Шесть ШИМ каналов. Atmega48/168.

Добавлено: Пн окт 16, 2017 09:37:14
7seg
Частота и нужна одна ) управлять надо скважностью.

Re: Шесть ШИМ каналов. Atmega48/168.

Добавлено: Пн окт 16, 2017 10:55:12
oleg110592
мега48 вроде все шимы работали:

Код: Выделить всё

TCCR0A=(1<<COM0A1) | (0<<COM0A0) | (1<<COM0B1) | (0<<COM0B0) | (1<<WGM01) | (1<<WGM00);
TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (1<<CS00);
OCR0A=0x7F;
OCR0B=0x7F;

TCCR1A=(1<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (1<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (1<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10);
OCR1AL=0x7F;
OCR1BL=0x7F;

TCCR2A=(1<<COM2A1) | (0<<COM2A0) | (1<<COM2B1) | (0<<COM2B0) | (1<<WGM21) | (1<<WGM20);
TCCR2B=(0<<WGM22) | (0<<CS22) | (0<<CS21) | (1<<CS20);
OCR2A=0x7F;
OCR2B=0x7F;
Изображение

Re: Шесть ШИМ каналов. Atmega48/168.

Добавлено: Пн окт 16, 2017 11:19:05
7seg
Вроде все гуд, большое спасибо!
Т.к Шпротеус у меня подглючивает буду макетку собирать и оцылоскопом туда тыкаться )