04.03.2013, 10:21 | #11 (permalink) |
Member
Регистрация: 13.05.2011
Сообщений: 401
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 274
|
Цифра 73... получается так (указано в скобках) 4800000/256=18750 - кол-во приращений таймером в секунду, где 4800000 - тактовая частота 4,8МГц, 256 делитель, теперь 18750/256=73...Гц, где 256 - колво приращений при которых произойдет переполнение счетчика таймера, а 73Гц - частота ШИМа. Но 73Гц - великовато для сервака - перегреется и сгорит (данный эфект уже получен ) ). |
04.03.2013, 10:21 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
Аналогичные проблемы уже обсуждались ранее Очень нужна подсказка по блоку питания Рекурсия, язык с++ Язык программирования F# Функции, язык Си |
12.03.2013, 08:54 | #12 (permalink) |
Member
Регистрация: 23.02.2013
Сообщений: 1,353
Сказал(а) спасибо: 4
Поблагодарили 5 раз(а) в 2 сообщениях
Репутация: 5285
|
Наткнулся еще на одну статью.
Понятно как расчеты делаются, не понятно только как она работает. Листинг программы: Код:
#include <avr/io.h> #include <util/delay.h> //Что делает эта функция? void Wait() { uint8_t i; for(i=0;i<50;i++) { _delay_loop_2(0); _delay_loop_2(0); _delay_loop_2(0); } } void main() { //Ну это мне уже понятно, настроки таймеров, в даташите имеется таблица. TCCR1A|=(1<<COM1A1)|(1<<COM1B1)|(1<<WGM11); //NON Inverted PWM TCCR1B|=(1<<WGM13)|(1<<WGM12)|(1<<CS11)|(1<<CS10); //PRESCALER=64 MODE 14(FAST PWM) //Вот это, как я понял, задает интервал всего импульса? Т.е. тот самый такт в 20мс при частоте 50Гц. ICR1=4999; //fPWM=50Hz (Period = 20ms Standard). DDRD|=(1<<PD4)|(1<<PD5); //Тоже ясно, выходы. while(1) { //Ну передача значения в OCR1A тоже ясна, с помощью этого задается ширина импульса. OCR1A=97; //0 degree Wait(); //Зачем вызываем эту функцию? Что она делает? OCR1A=316; //90 degree Wait(); OCR1A=425; //135 degree Wait(); OCR1A=535; //180 degree Wait(); } } |
12.03.2013, 12:48 | #14 (permalink) |
Member
Регистрация: 23.02.2013
Сообщений: 1,353
Сказал(а) спасибо: 4
Поблагодарили 5 раз(а) в 2 сообщениях
Репутация: 5285
|
Т.е. в данной программе атмега16 используется только для поворота сервы и ничего кроме?
_delay_loop_2(0) - пока не сталкивался с таким оператором, понятно что задержка, но на сколько, учитывая что ему передается ноль, несколько тактов? |
12.03.2013, 15:27 | #15 (permalink) |
Member
Регистрация: 13.05.2011
Сообщений: 401
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 274
|
Да похоже это не библиотечная функция, кто-то сам ее написал. Все функция Wait() должна занимать 1-2С.
Да, чуть не забыл. Обратите внимание в данной программе частота шим задается верхним переделом переполнения таймера (регистр ICR1). |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
12.03.2013, 15:46 | #16 (permalink) |
Member
Регистрация: 23.02.2013
Сообщений: 1,353
Сказал(а) спасибо: 4
Поблагодарили 5 раз(а) в 2 сообщениях
Репутация: 5285
|
Будем пробовать.
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
|
|