roboforum.ru

Технический форум по робототехнике.

ШИМ и Таймеры

ШИМ и Таймеры

snayperAlfa » 01 фев 2009, 02:00

Захотелось мне тут сделать генератор на 36 KHz. Сначала сделал просто через Delay_us(). Но так не интересно. Надо бы через ШИМ. Есть кварц 11.059200 MHz и Мега16. Как я не пытался не получается точно частота 36 KHz. Скважность не 50% а плавает. Далее сделал через таймер и в прерывании изменял состояиние вывода. Вот код:
Код: Выделить всёРазвернуть
#include <mega16.h>
#include <delay.h>
   
// Timer 0 output compare interrupt service routine
interrupt [TIM0_COMP] void timer0_comp_isr(void)
{
// Place your code here
  PORTB.0=~PORTB.0;
}

// Declare your global variables here

void main(void)
{
 
  DDRB=1;

TCCR0=0b00011001;
TCNT0=0;
OCR0=150;

TIMSK |= (1 << 1);

SREG |= (1 << 7);

while (1)
      {

      };
}


А теперь вопрос: как это записать красиво через ШИМ, но чтобы не было прерывания, а то получится тот же таймер.

Re: ШИМ и Таймеры

avr123.nm.ru » 01 фев 2009, 02:42

snayperAlfa писал(а):как это записать красиво через ШИМ, но чтобы не было прерывания, а то получится тот же таймер.

Рекомендую воспользоваться очень удобным, интерактивным мастером кода компилятора ICC - вот пример настройки таймера - http://avr123.nm.ru/z6.htm

Или мастером CVAVR - вот пример ШИМ - http://avr123.nm.ru/z8.htm

Re: ШИМ и Таймеры

snayperAlfa » 01 фев 2009, 14:41

Генератор кода это штука удобная когда только начинаеш разбираться. Если посмотреть в перспективу, то генератор кода разлагает мозг программера, поскольку если компилятор сделает гдето ошибку, то ты не сможеш понять в чем дело.
Если кто может,то выложите код запуска ШИМа 8-битного на кварц 11,059200 MHz

Re: ШИМ и Таймеры

avr123.nm.ru » 01 фев 2009, 15:28

snayperAlfa писал(а):генератор кода разлагает мозг программера

Фантастика ! Как он это делает ? Капает на мозг кислотой аль щелочью ЖЖЖЕТ ?

snayperAlfa писал(а): если компилятор сделает гдето ошибку, то ты не сможеш понять в чем дело.

Типа СЕКРЕТНЫЙ НЕВИДИМЫЙ код чтоль создает ? Ни в даташите не почитать ни в симуляторе ни в железе увидеть что не та ... ДА ?

Фантастика ! Жуть какая-то.

А если компилятор Си паскаля или бэйсика ошибочно скомпилит умножение например, то наверно сразу повесится надА ? Пока мозг не разложился.

Re: ШИМ и Таймеры

snayperAlfa » 01 фев 2009, 17:53

:) Можно конечно и так описать процесс использования генератора кода.Разложение происходит на уровне:не хочу сомтреть даташит,лучше запущу генератор в CV. А теперь по существу: какой режим PWM использовать для генерации меандра 36 KHz. Кварц 11,059200 MHz. У меня не получился приемлемый результат с использованием Fast и Phase correction PWM. Не получается ровный меандр. Что записаь в регистр таймера 8-битного что бы получить 36 KHz, но чтобы не было обработки прерывания(чтоб не было как в первом посте с таймером).

Re: ШИМ и Таймеры

avr123.nm.ru » 01 фев 2009, 19:16

snayperAlfa писал(а):не хочу сомтреть даташит, лучше запущу генератор в CV.

Правильно. Именно для такой последовательности генератор и создан. А если вы уже в даташите нашли то нафига вам генератор то ???

Но никто не мешает вам после создания кода в генертаоре почитать даташит про те регистры с которыми работает код от генератора и понять что и зачем он сделал.

snayperAlfa писал(а): какой режим PWM использовать для генерации меандра 36 KHz. Кварц 11,059200 MHz. У меня не получился приемлемый результат с использованием Fast и Phase correction PWM.

Дак он и не может получится. Делители имеют грубый шаг и частоты ШИМ получаются с грубым шагом если не использовать прерывания и не менять в них некоторые параметры.


Добавлено спустя 14 минут 53 секунды:
Вот мастер выдал. Возможно надо частоту 72000 задавать.

ОСТОРОЖНО Смотрите !!! чтоб только МОЗГ у вас не начал разрушаться !!!

Надеюсь ничто не помешает вам теперь посмотреть даташит и разобраться что означают установки в этих регистрах.

Возможно этот код даже работать будет если соотв ножку МК выходом назначить ...

//ICC-AVR application builder : 01.02.2009 18:05:41
// Target : M16
// Crystal: 11.059Mhz

//TIMER0 initialize - prescale:8
// WGM: CTC
// desired value: 36000Hz
// actual value: 35445,510Hz (-1,6%)
void timer0_init(void)
{
TCCR0 = 0x00; //stop
TCNT0 = 0xDA; //set count
OCR0 = 0x26; //set compare
TCCR0 = 0x1A; //start timer
}

Изображение

Re: ШИМ и Таймеры

snayperAlfa » 01 фев 2009, 20:07

Попробуйте запустить ваш пример в Протеусе и увидите частоту в 18 KHz.

Вот я модернезировал свой код используя CTC:
Код: Выделить всёРазвернуть
#include <mega16.h>
#include <delay.h>
/*   
// Timer 0 output compare interrupt service routine
interrupt [TIM0_COMP] void timer0_comp_isr(void)
{
// Place your code here
  PORTB.0=~PORTB.0;
}
  */
// Declare your global variables here

void main(void)
{
 
  DDRB=0xff;

TCCR0=0b00011001;
TCNT0=0;
OCR0=150;

//TIMSK |= (1 << 1);

//SREG |= (1 << 7);

while (1)
      {

      };
}


Так что еще неизвестно кому мозг генератор разлагает :)
Вложения
36 KHz.rar
Вот пожалуйста можно убедится
(11.29 КиБ) Скачиваний: 41

Re: ШИМ и Таймеры

avr123.nm.ru » 01 фев 2009, 20:22

snayperAlfa писал(а):Попробуйте запустить ваш пример в Протеусе и увидите частоту в 18 KHz.


А вы ПОПРОБУЙТЕ ВНИМАТЕЛЬНО прочитать мой пост .... Может быть разглядите про 72000 ...

И еще можно на скрин мастера ВНИМАТЕЛЬНО ПОЗЫРИТЬ и увидет частоту какого события он показывает !


Rambler\'s Top100 Mail.ru counter