Период ШИМ определяется скоростью переполнения вашего таймера. В разделе «Режимы работы» есть много настроек, о которых стоит подумать. Если все, что вы хотите сделать, это сгенерировать прямоугольную волну с постоянным периодом с переменным рабочим циклом, я думаю, вы захотите использовать режим CTC (Сброс таймера при сравнении совпадений). Основная идея состоит в том, чтобы установить OCR0A на число тактов таймера до тех пор, пока вы не захотите, чтобы штифт переключился в следующий раз, и использовать прерывание Compare Match, чтобы изменить это значение в следующий раз. Так что в avr-gcc это будет выглядеть примерно так:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdint.h>
// global variables defining number of ticks on and off
uint8_t on_time_ticks, off_time_ticks, csxx_bits=0;
void setup_timer(double p_ms, double duty){
TCCR0A = _BV(COM0A0) // toggle OC0A on Compare Match
TCCR0B = _BV(WGM02); // set CTC mode WGM0[2,1,0] = 0b100
// ... do some stuff based on your CPU frequency
// to define the csxx_bits of TCCR0B when the timer is running
// and consequently, to set on_time_ticks and off_time_ticks
OCR0A = on_time_ticks;
TCCR0B |= your_settings_here;
}
void start_timer(){
//start the timer running at the desired rate
TCCR0B |= csxx_bits;
}
int main(int argc, char **argv){
double period_ms, duty_cycle;
setup_timer(period_ms, duty cycle);
start_timer();
for(;;){
//spin or sleep or whatever
}
}
ISR(TIM0_COMPA_vect){
if(OCR0A == on_time_ticks){
OCR0A = off_time_ticks;
}
else{
OCR0A = on_time_ticks;
}
}
Предупреждение, это непроверенный код, но я думаю, что идея верна. Это ни в коем случае не единственный способ сделать это.
Кстати, есть одна вещь, которую вы должны знать о ATTiny13. Точность внутреннего генератора RC гарантируется только в пределах 10% от заводского уровня. Вы можете пройти процедуру пользовательской калибровки (описанную приложением atmel ), которая обеспечит вам точность 2% для ATTiny13. Если вы хотите добиться большего, чем это, вам, вероятно, понадобится использовать чип, который поддерживает внешний кристалл ...