|
|
  |
Конфигурирование timer1 (Atmega16) в режим PWM |
|
|
|
Feb 2 2011, 15:50
|
Участник

Группа: Участник
Сообщений: 69
Регистрация: 11-01-08
Пользователь №: 34 008

|
Добрый день, Подскажите плз в чем может быть проблема , хочу сделать два канала ШИМ 8 bit на выходы OC1A,OC1B , использую timer1 конфигурирую его для работы в режиме Fast Mode 8 bit
#define setbit(x,y) (x|=(1<<y)) #define clearbit(x,y) (x&=~(1<<y)) #define checkbit(x,y) (x&(1<<y))
TCCR1B = 2; //clk/8 setbit(DDRD,PD5); setbit(DDRD,PD4);
setbit(TCCR1A,WGM10); clearbit(TCCR1A,WGM11); setbit(TCCR1B,WGM12); clearbit(TCCR1B,WGM13); установка режима fast mode setbit(TCCR1A,COM1A0); setbit(TCCR1A,COM1A1); setbit(TCCR1A,COM1B0); setbit(TCCR1A,COM1B1); управление выводом OCR1AH=255/256; OCR1AL=255%256; //setbit(TIMSK,OCIE1A); //INT CompareA enable
OCR1BH=255/256; OCR1BL=255%256; //setbit(TIMSK,OCIE1B); //INT CompareA enable
По отдельности выводы OC1A и OC1B работают , а вместе не хотят . В чем может быть причина?
|
|
|
|
|
Feb 2 2011, 16:21
|
Группа: Новичок
Сообщений: 5
Регистрация: 1-02-11
Из: Запорожье
Пользователь №: 62 620

|
Вот тебе работающий пример из СVAVR. Кстати, ты не забыл OC1A OC1B (PD4, PD5) сделать выходами? DDRD=0x30; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 1000,000 kHz clk/8 // Mode: Fast PWM top=00FFh // OC1A output: Non-Inv. // OC1B output: Non-Inv. // Noise Canceler: Off // Input Capture on Falling Edge // Timer 1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0xA1; TCCR1B=0x0A; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x80; //pwm1 0...FF OCR1BH=0x00; OCR1BL=0x80; // pwm2 0...FF Цитата(2891oleg @ Feb 2 2011, 18:10)  Вот тебе работающий пример из СVAVR. Кстати, ты не забыл OC1A OC1B (PD4, PD5) сделать выходами?
DDRD=0x30;
// Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 1000,000 kHz clk/8 // Mode: Fast PWM top=00FFh // OC1A output: Non-Inv. // OC1B output: Non-Inv. // Noise Canceler: Off // Input Capture on Falling Edge // Timer 1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0xA1; TCCR1B=0x0A; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x80; //pwm1 0...FF OCR1BH=0x00; OCR1BL=0x80; // pwm2 0...FF Пардон, вижу, что не забыл: setbit(DDRD,PD5); setbit(DDRD,PD4);
|
|
|
|
|
Feb 2 2011, 16:40
|
Участник

Группа: Участник
Сообщений: 69
Регистрация: 11-01-08
Пользователь №: 34 008

|
Цитата(2891oleg @ Feb 2 2011, 19:21)  Вот тебе работающий пример из СVAVR. Огромное спасибо, причину нашел она была не в программе , а в том что я не туда припаял светодиод на котором смотрел ШИМ. Ваша программа дала мне уверенность, зная что она точно работает стал искать причину в другом и нашел! А так полдня копался в программе думал в настройках ШИМа косяк. Большое спасибо!
|
|
|
|
|
Apr 27 2011, 19:36
|
Участник

Группа: Участник
Сообщений: 69
Регистрация: 27-06-06
Пользователь №: 18 383

|
не буду создавать новую тему спрошу тут также про Timer 1 МК Atmega 32 Задача использую Timer 1 Нужно генерировать два прерывания 1:с изменяющей частотой от 500Гц до 11кГц, главное менять состояние вывода на PD5 аппаратно, но можно и программно 2:с частотой 1/64с 15.625мс или 64Гц. При этот состояние вывода PD4 не нужно. Поменять выводы пины PD5 и PD4 можно, как и прерывания. делаю так, режим FastPWM(14). но наверное можно и CTC(12) инициализация таймера Код // Инициализация таймера 1 // Выбор источника тактого сигнала и коэфф. предделителя TCCR1B|=(0<<CS12)|(1<<CS11)|(0<<CS10); // коэфф. 8 // Режим работы FASTPWM - сброс при совпадении TCCR1B|=(1<<WGM13)|(1<<WGM12)|(1<<WGM11); //WGM10-0 по defualt TIMSK|=(1<<OCIE1A)|(1<<OCIE1B); //Разеришь прерывание по событию "совпадение А" таймера 1 //Разеришь прерывание по событию "совпадение B" таймера 1 TCCR1A|=(1<<COM1A0);//Разрешить изменения состояние выхода на противоположное ICR1=0x464F;//15.625мс OCR1B=0x464F;//15.625мс OCR1A=0x08FF;//500Гц Ну и обработка прерывания Код */ // Прерывание по совпадению таймера 1 A #pragma vector=TIMER1_COMPA_vect __interrupt void StepDriver(void) { //PORTD ^= (1<<(5)); попытка программно менять состояние пина. // что то делаем } // Прерывание 15.625мс #pragma vector=TIMER1_COMPB_vect __interrupt void SpeedUpDown(void) { // что то делаем //OCR1A= новое значение } В результате на выходе PD5 получаю постоянно частоту 1/64с 64гц. в чем я ошибся?
Сообщение отредактировал Roger - Apr 28 2011, 07:22
|
|
|
|
|
Apr 28 2011, 09:44
|
Участник

Группа: Участник
Сообщений: 69
Регистрация: 27-06-06
Пользователь №: 18 383

|
Цитата(Палыч @ Apr 28 2011, 12:36)  Один таймер - одна частота. Вероятно, нужно задействовать ещё один таймер, если есть свободный. Есть таймер 2 свободный... но посчитал, он не подойте чтобы использовать его для прерывания 1/64с А всякими финтами можно добится поставленной задачи?
Сообщение отредактировал Roger - Apr 28 2011, 09:47
|
|
|
|
|
Apr 28 2011, 11:34
|
Участник

Группа: Участник
Сообщений: 69
Регистрация: 27-06-06
Пользователь №: 18 383

|
Цитата(Палыч @ Apr 28 2011, 14:51)  Зависит от используемой тактовой частоты и требуемой точности F= 9,216 MГц -> 64,2857 1/c F=14,746 MГц -> 64,0017 1/c Да забыл указать 18.432МГц Точность для 1/64с не так уж и важна
Сообщение отредактировал Roger - Apr 28 2011, 11:35
|
|
|
|
|
Apr 28 2011, 12:35
|
Участник

Группа: Участник
Сообщений: 69
Регистрация: 27-06-06
Пользователь №: 18 383

|
Малек разогнал... както 1/64с была отпимально. посмотрим что получится при 1/128с
|
|
|
|
|
May 3 2011, 06:16
|
Участник

Группа: Участник
Сообщений: 69
Регистрация: 27-06-06
Пользователь №: 18 383

|
Цитата(Палыч @ Apr 28 2011, 15:52)  Прийдётся применять ещё программное деление на два. А это пояснить можно? мое предположение сводиться к тому что, пропускать одно прерывание.... я ошибаюсь?
|
|
|
|
|
May 5 2011, 10:40
|
Участник

Группа: Участник
Сообщений: 69
Регистрация: 27-06-06
Пользователь №: 18 383

|
Цитата(Палыч @ May 3 2011, 10:25)  Да, каждое второе прерывание - пропускать (выходить из прерывания ничего не делая). спасибо
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|