Как уже написал мучает меня контроллер ATtiny 26L.
В даташите есть страница под номером 57.
Я настроил контроллер под первую строку в этой таблице.
тактовая 1 МГц по умолчанию.
Режим не FAST.
В соответствие с таблицей и формулами в документе
сделал следующее 1000000 Гц/16=62500 Гц
потом 62500Гц /(OCR1C=199+1)=312.5 Гц
То есть частота ШИМ равна 312.5 Гц
замерил на осциллографе. Все четко.
Длительность импульса шим регулируется
Но в таблице ещё есть параметр частота дискритизации ШИМ и равна она 20кГц в моем случае
ВОПРОС. Как ее рассчитать ?Помогите иначе с ума сойду
Как только запустился таймер, прерывание сработает, когда он переполнится.
Как его заполнять и на какой тактовой частоте - твоя задача.
Не забудь про прескаллер (делитель) своего таймера прочитать.
Как только запустился таймер, прерывание сработает, когда он переполнится.
Как его заполнять и на какой тактовой частоте - твоя задача.
Не забудь про прескаллер (делитель) своего таймера прочитать.
Если я правильно понял то прескаллер это есть регистр TCCR1B
TCCR1B|=(1
Или есть ещё какой-то прескаллер о котором я не увидел инфу в доках ?
Timer/Counter1 Control Register A – TCCR1A
Режим работы таймера
Timer/Counter1 Control Register B – TCCR1B
4 бита прескаллера CS13 CS12 CS11 CS10
PCK - PCK/16384, тоесть 1 счет таймера за опредеденной количество циклов тактового генератора.
в моем даташите страница 52 с таблицей.
На пальцах:
cli ; Disable interrupts
TCCR1B = (TCR1B &0xC0 | 0x04); ставим прескаллер F.osc/8.
заносим значение в TCNT1 (внимательно читаем как), ибо там есть неплохие грабли...
sei ;
ждем прерывания, по надобности его обрабатываем, либо в векторе ставим Reti.
Timer/Counter1 Control Register A – TCCR1A
Режим работы таймера
Timer/Counter1 Control Register B – TCCR1B
4 бита прескаллера CS13 CS12 CS11 CS10
PCK - PCK/16384, тоесть 1 счет таймера за опредеденной количество циклов тактового генератора.
в моем даташите страница 52 с таблицей.
На пальцах:
cli ; Disable interrupts
TCCR1B = (TCR1B &0xC0 | 0x04); ставим прескаллер F.osc/8.
заносим значение в TCNT1 (внимательно читаем как), ибо там есть неплохие грабли...
sei ;
ждем прерывания, по надобности его обрабатываем, либо в векторе ставим Reti.
Может мы о разных режимах беседуем
Как видишь, я прерывание здесь вообще не использую. ШИМ блок
работает аппаратно
#include
#include
void dnPWM (void) {
if (OCR1A
OCR1A=OCR1A-2 ; // уменшаем содержимое регистра сравнения
}
while ((PINB&(1
}
void upPWM (void) {
if (OCR1A>1){
OCR1A=OCR1A+2 ; // увеличиваем содержимое регистра сравнения
while(1){
scan(); // опрос кнопок
if (TIFR&(1
TIFR=0x64; // и PB0 меняет своё состояние за два такта и на осцилографе видно что таймер
// переполняется с частотой 62500 гЦ
if ((PORTB&(1
PORTB|=(1
if (PORTB&(1
PORTB&=~(1
}
}
}
}
}
Добавлено 02-06-2015 13:24
Отобразилось не совсем правильно. Работаю с AVR Studio 4 + WINAVR
Все. Разобрался. Извиняюсь за коламбур.
Формула (на стр.56 прикрепленного мной даташита.) Fpwm=Ftck1/(OCR1C+1) подходит для расчета режима FAST PWM и так же для расчета режима обычного PWM.Я делал расчет обычного PWM ,а смотрел в таблицу 27.И конечно же у меня ничего не получалось.Т.к я брал тактовую частоту 1мГц.А таблица эта сделана для расчета от 64мГц.То есть если мы в таблицу поставим за место PCK число 64000000 гц то все сходится.Вот тут то я и заблудился думая ,что это частота дискритизации( в самой левой колонки в таблице ) при 1мГц.А это оказалась частота FAST PWM при 64мГц.
Объяснил как мог.