atmega8 pwm 38khz

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

atmega8 pwm 38khz

Сообщение NEOSoftWare » 01 фев 2012, 02:09

подскажите пожалуйста, как настроить шим чтобы на выходе было 38khz со скважностью 30% при частоте самой мк 1 или 8 мгц.
NEOSoftWare
 
Сообщения: 142
Зарегистрирован: 16 фев 2011, 00:52
прог. языки: PHP, ActionScript, Delphi, Visual Basic, Perl,Java

Re: atmega8 pwm 38khz

Сообщение Angel71 » 01 фев 2012, 03:32

тут немного инфы по шиму http://aquaticus.info/pwm-frequency и тут. смотрите какой режим нужен и можно ли в нём такой частоты достичь. по формуле прикидываете какой частоты кварц максимально подойдёт и нужно ли 8ю мегу на какую другую мегу/тиньку на 20мгц заменить или 8ю разогнать. +думаете, будет ли на этой частоте всё необходимое работать нормально (как минимум уарт) и критично, что если решитесь разогнать у вас при разгоне чтот может отвалится.
Аватара пользователя
Angel71
 
Сообщения: 10668
Зарегистрирован: 18 апр 2009, 22:18

Re: atmega8 pwm 38khz

Сообщение grek » 01 фев 2012, 08:26

Вот, должна помочь.
Вложения
AVR_calc_2_0.rar
Программа для расчета
(201.09 КиБ) Скачиваний: 0
grek
 
Сообщения: 159
Зарегистрирован: 16 сен 2009, 15:41
Откуда: Арзамас

Re: atmega8 pwm 38khz

Сообщение Extraneous » 03 мар 2013, 10:29

Что-то не получается. Помогите, пожалуйста.
Пытаюсь запустить ШИМ на Atmega8. Поставил фьюзы для внутреннего генератора на 8Мгц с помощью калькулятора. С предделителем 256 должна получиться частота 31.25 КГц. Код сгенерировал через Codevision:
Изображение Изображение

Для примера попробую скважность в 50%, в OCR1A вписал 1023/2 = 511 = 1FF:
Код: Выделить всё
#include <mega8.h>

void main(void){
DDRB=0b00000110;

TCCR1A=0xA3;
TCCR1B=0x0C;

TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;

OCR1AH=(char)(0x1FF>>8);
OCR1AL=(char)0x1FF;

while (1)  {};
}


Но почему-то вместо частоты в тридцать килогерц светодиод, подключенный к PB1, мигает несколько раз в секунду! Если сделать таймер, например, на 125Кгц - начинает мигать очень часто, но различимо глазом. Навскидку - частота получается в 10000 раз меньше, чем требуется. Вычитал про фьюз-бит SCKDIV8 - делитель частоты, но в Atmega8 его нет. Может быть, я что-то напутал с фьюзами, частота получилась не 8Мгц, и поэтому МК работает медленно?
Что я делаю не так?

Ответ: таймер отсчитывает от 0 до 1023 и на этом промежутке переключает уровень на ножке МК. Поэтому, чтобы узнать частоту ШИМ, нужно частоту таймера разделить на число, до которого таймер считает, в данном случае на 1023, или на 2*1023 для режима [url=http://roboforum.ru/wiki/AVR:ШИМ]Phase Correct[/url].
Последний раз редактировалось Extraneous 03 мар 2013, 20:48, всего редактировалось 1 раз.
Аватара пользователя
Extraneous
 
Сообщения: 7
Зарегистрирован: 17 дек 2012, 23:16
Откуда: Усть-Каменогорск
прог. языки: LISP

Re: atmega8 pwm 38khz

Сообщение Extraneous » 03 мар 2013, 20:33

Что-то никто не отвечает, но я, кажется, уже и сам понял, почему так получается.
Во время работы таймер в каждый такт добавляет 1 к регистру TCNT. В тот момент, когда TCNT сравняется с OCR1, уровень на ножке OC1A поменяется на противоположный. Получается, если предделитель равен 1, а TOP = 1023, частота ШИМ получится не 8Мгц, а 8000/1023 = 7.82 Кгц. А если еще и предделитель поставить 8, в итоге получится частота 7.82/8 = 977 Гц.
Я всё правильно понимаю?
(пока мысль не потерялась, решил записать; сейчас на макетке попробую)

Добавлено спустя 2 часа 56 минут 11 секунд:
Собрал вот такой простой код. ШИМ в режиме 1 "Phase correct, TOP = 0xFF". В этом режиме таймер считает от 0 до 255, потом обратно, значит, полный цикл - 510. Частоту задал кварцем на 8 МГц. Значит, должна получиться частота ШИМ: 8000/510=15.6 Кгц.

Код: Выделить всё
//кварц 8 МГЦ, компилятор CodeVisionAVR
#include <mega8.h>
void main(void) {

TCCR1A.7=1; //установил 1 в COM1A1, табл 36 ДШ
TCCR1A.0=1; //установил 1 в WGM10, режим 1, табл 39 ДШ
TCCR1B.0=1; //установил 1 в SC10, предделитель /1, табл 40 ДШ

DDRB.1=1; установил PB1 на выход

OCR1A = 50; //скважность получится 50/255=19.6%

while(1)
}


Частотомер показывает 12.8 КГц. Ну, уже что-то. Но частота неточная.
Попробовал сделать другой код, с использованием delay: ждем 50мкс, устанавливаем 1, еще 50 мкс, устанавливаем 0. Должна получиться частота 10 Кгц, но на частотомере - 8.6Кгц. Наверное, частотомер глючит.
Разбираюсь дальше.
Аватара пользователя
Extraneous
 
Сообщения: 7
Зарегистрирован: 17 дек 2012, 23:16
Откуда: Усть-Каменогорск
прог. языки: LISP

Re: atmega8 pwm 38khz

Сообщение Duhas » 04 мар 2013, 03:56

а тактируете от кварца ? таймер должен давать точную частоту, относительно тактовой
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"
Аватара пользователя
Duhas
 
Сообщения: 6338
Зарегистрирован: 15 сен 2007, 13:03
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович

Re: atmega8 pwm 38khz

Сообщение Extraneous » 04 мар 2013, 15:30

Да, сначала пробовал от внутреннего генератора, потом раздобыл кварц на 8МГц. Все равно частота не совпадает.
В связи с этим вопрос. Как узнать, кто меня обманывает: Atmega или частотомер? Откуда можно взять калиброванную частоту, чтобы ее померить и узнать, не врет ли частотомер?
Он от 1 КГц измеряет.

Добавлено спустя 29 минут 41 секунду:
Опять отвечаю сам себе.
Вспомнил про программу SineGen. Она генерирует синусоидальный сигнал нужной частоты через звуковую карту компьютера. Скачал, запустил, прицепил частотомер - так и есть, вместо 10КГц показывает 8,1. Значит, ATmega меня не обманывал: 15.6*0.81 = 12.6 - так же, как было в предыдущем случае. Буду измерять частоту и умножать на поправочный коэффициент :) Ну, что еще ожидать от китайского мультиметра.
Спасибо всем за помощь!)
Аватара пользователя
Extraneous
 
Сообщения: 7
Зарегистрирован: 17 дек 2012, 23:16
Откуда: Усть-Каменогорск
прог. языки: LISP


Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

cron