void init_handler() { // Настроим и запустим таймер с периодом 20 миллисекунд (50 срабатываний в секунду == 50Гц): // prescaler=1:64, adjustment=25000-1: // 80000000/64/25000=50 (срабатывает 50 раз в секунду, т.е. каждые 20мс), // минус 1, т.к. считаем от нуля. // Обработчик прерывания от таймера - функция handle_interrupts // (с заданными настройками будет вызываться каждые 20мс). initTimerISR(TIMER3, TIMER_PRESCALER_1_64, 25000-1); }
/** * Запустить цикл шагов на выполнение - запускаем таймер, обработчик прерываний * отрабатывать подготовленную программу. */ void start_stepper_cycle() { cycle_running = true; // Запустим таймер с периодом 10 микросекунд (100тыс операций в секунду): // 80000000/8/100000=100=0x64 timer_freq_us = 10; initTimerISR(TIMER3, TIMER_PRESCALER_1_8, 0x64); // для частоты 1 микросекунда (1млн операций в секунду): // 80000000/8/1000000=10=0xA // timer_freq_us = 1; // initTimerISR(TIMER3, TIMER_PRESCALER_1_8, 0xA); }
void init_handler() { // http://www.robotshop.com/letsmakerobots/arduino-101-timers-and-interrupts // 1. CPU frequency 16Mhz for Arduino // 2. maximum timer counter value (256 for 8bit, 65536 for 16bit timer) // 3. Divide CPU frequency through the choosen prescaler (16000000 / 256 = 62500) // 4. Divide result through the desired frequency (62500 / 2Hz = 31250) // 5. Verify the result against the maximum timer counter value (31250 < 65536 success) if fail, choose bigger prescaler. // Настроим и запустим таймер с периодом 20 миллисекунд (50 срабатываний в секунду == 50Гц): // prescaler=1:8, adjustment=40000-1: // 16000000/8/50=40000 (50Hz - срабатывает 50 раз в секунду, т.е. каждые 20мс), // минус 1, т.к. считаем от нуля. // Обработчик прерывания от таймера - функция handle_interrupts // (с заданными настройками будет вызываться каждые 20мс). initTimerISR(TIMER1, TIMER_PRESCALER_1_8, 40000-1); }
/** * Запустить цикл шагов на выполнение - запускаем таймер, обработчик прерываний * отрабатывать подготовленную программу. */ void start_stepper_cycle() { cycle_running = true; // включить моторы digitalWrite(motor1_pin_en, LOW); digitalWrite(motor2_pin_en, LOW); // Запустим таймер с периодом 10 микросекунд (100тыс операций в секунду): // 80000000/8/100000=100=0x64 timer_freq_us = 10; initTimerISR(TIMER3, TIMER_PRESCALAR_1_8, 0x64); // для частоты 1 микросекунда (1млн операций в секунду): // 80000000/8/1000000=10=0xA // timer_freq_us = 1; // initTimerISR(TIMER3, TIMER_PRESCALAR_1_8, 0xA); }
void start_cycle() { cycle_state=true; initTimerISR(TIMER3,TIMER_PRESCALAR_1_8,0x64); }