roboforum.ru

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

Таймеры в микроконтроллерах

Re: 2PWM

Master » 30 ноя 2007, 15:36

Configurator писал(а):Честно сказать, я так и невкурил, как мне выставить точную частоту 2ШИМ в 50 Гц.
Этим что, никто не занимается? Ребят, вы как с Луны свалились.
Вы можете подсказать, как это по шагам сделать, хоть примерно.

Так ты определись с частотой МК в начале.

Re: 2PWM

Strijar » 30 ноя 2007, 15:53

Default Clock Source
The device is shipped with internal RC oscillator at 8.0MHz and with the fuse CKDIV8 programmed,
resulting in 1.0MHz system clock.


Ну взял и всю малину испортил! А так бы человек никогда и не узнал, что такое CKDIV! ;)

Re: 2PWM

Configurator » 30 ноя 2007, 16:14

Значит, если я пользуюсь ШИМом, от внутреннего генератора, то начальную частоту я могу поделить только на 1024, 256, 64, 8. Так?

Если я подключаю кварц, то кроме пределителя я еще могу пользоваться TCNT0?
Так?
Для точной доводки?

Re: 2PWM

Strijar » 30 ноя 2007, 16:29

Не. Мухи отдельно, котлеты отдельно!
Если я подключаю кварц, то кроме пределителя я еще могу пользоваться TCNT0?

Делитель ШИМа работает независимо от основного генератора. Основной генератор делится отдельно (CKDIV), ШИМ делится отдельно (TCNT и проч).

Re: 2PWM

Configurator » 30 ноя 2007, 16:45

Делитель ШИМа работает независимо от основного генератора. Основной генератор делится отдельно (CKDIV), ШИМ делится отдельно (TCNT и проч).

А вот и нет! :shock:
Ппри работе с ШИМ, мы можем делить только пределителем! На 1024, 256, 64 и 8! :evil:
TCNT0 катит только с таймерами, если задействовано прерывание! С ШИМ он не работает! :evil:

Re: 2PWM

Strijar » 30 ноя 2007, 17:03

Или я туплю или одно из двух. ШИМ работает от таймера. Все зависит от режима (стр 104, 133, 157, ДШ ATmega48/88/168) Я через TCNT не делал, не зачем было! Вот мой код вывода звука через ШИМ.

Код: Выделить всёРазвернуть
#include <avr/pgmspace.h>
#include <avr/interrupt.h>

unsigned int    sound = 0;
unsigned char   *data;

#define DIV_0           ((0 << CS22) | (0 << CS21) | (1 << CS20))
#define DIV_8           ((0 << CS22) | (1 << CS21) | (0 << CS20))
#define DIV_64          ((0 << CS22) | (1 << CS21) | (1 << CS20))
#define DIV_256         ((1 << CS22) | (0 << CS21) | (0 << CS20))
#define DIV_1024        ((1 << CS22) | (0 << CS21) | (1 << CS20))

ISR(SIG_OUTPUT_COMPARE3A) {
    sei();

    if (sound) {
        if (sound--) {
            OCR1B = pgm_read_byte(data++);
        } else {
            TCCR1A = 0;
            TCCR1B = 0;
            TCCR3B = 0;
            DDRE &= ~(1 << PE2);
        }
    }
    TCNT3 = 0;
}

void SoundPlay(unsigned char* wave, unsigned int wave_size) {
    if (!sound) {
        data = wave;
        sound = wave_size;

        DDRE |= (1 << PE2);
        TCCR1A = (1 << WGM10) | (1 << COM1B1);
        TCCR1B = (1 << WGM12) | DIV_0;

        TCCR3A = 0;
        TCCR3B = DIV_8;
        OCR3A = 125;
        ETIMSK |= (1 << OCIE3A);
        TCNT3 = 0;
    }
}


ATmega162, внутрений RC, CKDIV=1 (8мгц)
На 1 таймере сидит ШИМ (32 кгц), на 3 - таймер для его обновления (8 кгц)

Re: 2PWM

rig » 30 ноя 2007, 17:03

раз почти разобрались вставлю и свои 20 копеек, разбираясь как же работает CKDIV выяснилось влияние этого фуза только на запуск МК, при высоких частотах ставится чтоб затормозить МК в 8 раз. Разбирался почти как
Strijar писал(а):Я сильно не задумываясь - выставил минимальную частоту таймера - повесил в обработчике "мигалку" и засек секундомером частоту.

пытался выставить 1/8/16 секунд и установкой фузов изменить частоту мигания. так вот установка в 1 или 0 CKDIV не дала ни какой разницы на мигание лампочки.
а установка предделителя как раз давала такой эффект.
вот мой первый топик:
viewtopic.php?f=2&t=2891

Re: 2PWM

Strijar » 30 ноя 2007, 17:08

Код: Выделить всёРазвернуть
    /* 8 MHz */

    CLKPR = (1 << CLKPCE);
    CLKPR = 0;


И не нужно никаких фузов...

Re: 2PWM

Configurator » 30 ноя 2007, 17:10

Понял я твою кодировку. У тебя стандартные пределители. Вот ты их и используешь. Точной доводки нет. А она и не нужна, если разобраться. Редко это бывает, когда нужна определенная частота ШИМ. Для определенной частоты нажен определенный кварц, чтоб поделив его на пределитель, получить требуемую.
:Yahoo!:

Re: 2PWM

rig » 30 ноя 2007, 17:15

во во, так теперь и делаю. мастер кодевижена сам это же и вставляет

Re: 2PWM

Strijar » 30 ноя 2007, 17:16

В ДШ на указанных страницах черным по белом написано, что TOP ШИМа (его частота) может зависеть от OCRхA или ICRx ...

Re: 2PWM

avr123.nm.ru » 30 ноя 2007, 18:56

Вот сделал 50 Гц 2х ШИМ на Таймер_0 в ATmega48 от внутреннего генератора на 8 МГц
с пояснениями, расчетами и симуляцией в AVR Studio - всё в архиве.

На PD5 шим инвертированый а на PD6 "обычный".

Настройка прерываний и ШИМ сделана с помощью мастером CVAVR !

Что такое ШИМ - задача 8 краткого курса - http://www.avr123.nm.ru/z8.htm
Вложения
m48_pwm_timer0.rar
(7.96 КиБ) Скачиваний: 45

Re: 2PWM

Configurator » 03 дек 2007, 15:49

Выставил фьюзы. Хотел оставить 13 000 Гц.
Чип перестал отвечать.
Выставил:
CKSEL0 = 0
CKSEL1 = 0
CKSEL2 = 0
CKSEL3 = 0

CKDIV8 = 1

Re: 2PWM

avr123.nm.ru » 03 дек 2007, 17:47

Configurator писал(а):Выставил фьюзы. Хотел оставить 13 000 Гц.


Это ваши фантазии ???

Configurator писал(а): Чип перестал отвечать.
Выставил:
CKSEL0 = 0
CKSEL1 = 0
CKSEL2 = 0
CKSEL3 = 0

CKDIV8 = 1


Надеюсь такую комбинацию в не у меня вычитали - http://www.avr123.nm.ru/07.htm

Нет чтоб вначале спросить а потом сделать ...

Re: 2PWM

Strijar » 04 дек 2007, 20:46

avr123.nm.ru писал(а):Нет чтоб вначале спросить а потом сделать ...

А нафига? Ответ то ясен ;) А так человек Познает Мир...


Rambler\'s Top100 Mail.ru counter