roboforum.ru

Технический форум по робототехнике.
Текущее время: 30 ноя 2024, 05:12

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: atmega8 pwm 38khz
СообщениеДобавлено: 01 фев 2012, 02:09 
Не в сети

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: atmega8 pwm 38khz
СообщениеДобавлено: 01 фев 2012, 03:32 
Не в сети
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: atmega8 pwm 38khz
СообщениеДобавлено: 01 фев 2012, 08:26 
Не в сети

Зарегистрирован: 16 сен 2009, 15:41
Сообщения: 159
Откуда: Арзамас
Вот, должна помочь.


Вложения:
Комментарий к файлу: Программа для расчета
AVR_calc_2_0.rar [201.09 КиБ]
Скачиваний: 0
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: atmega8 pwm 38khz
СообщениеДобавлено: 03 мар 2013, 10:29 
Не в сети
Аватара пользователя

Зарегистрирован: 17 дек 2012, 23:16
Сообщения: 7
Откуда: Усть-Каменогорск
прог. языки: LISP
Что-то не получается. Помогите, пожалуйста.
Пытаюсь запустить ШИМ на 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 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: atmega8 pwm 38khz
СообщениеДобавлено: 03 мар 2013, 20:33 
Не в сети
Аватара пользователя

Зарегистрирован: 17 дек 2012, 23:16
Сообщения: 7
Откуда: Усть-Каменогорск
прог. языки: LISP
Что-то никто не отвечает, но я, кажется, уже и сам понял, почему так получается.
Во время работы таймер в каждый такт добавляет 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Кгц. Наверное, частотомер глючит.
Разбираюсь дальше.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: atmega8 pwm 38khz
СообщениеДобавлено: 04 мар 2013, 03:56 
Не в сети
Аватара пользователя

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

_________________
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: atmega8 pwm 38khz
СообщениеДобавлено: 04 мар 2013, 15:30 
Не в сети
Аватара пользователя

Зарегистрирован: 17 дек 2012, 23:16
Сообщения: 7
Откуда: Усть-Каменогорск
прог. языки: LISP
Да, сначала пробовал от внутреннего генератора, потом раздобыл кварц на 8МГц. Все равно частота не совпадает.
В связи с этим вопрос. Как узнать, кто меня обманывает: Atmega или частотомер? Откуда можно взять калиброванную частоту, чтобы ее померить и узнать, не врет ли частотомер?
Он от 1 КГц измеряет.

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 4 часа


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

Сейчас этот форум просматривают: Google [Bot] и гости: 8


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO