Доброго времени суток, Уважаемые!
Имею задачу сделать 10 ШИМ со следующими характеристиками:
— Кол-во шагов 1000
— Минимальная длинна импульса 10us
— Максимальная длинна импульса 1000us
— Тактовая чистота 100Hz
Решать задачу я принялся через 8-ми битный таймер.
Вот пример кода
Ввиду того что новичок в С и в AVR то имею ряд вопросов:
1) Правильно ли я делаю?
2) Не будет ли отжирать 99.9% процесорного времени данная конструкция ?
3) Как делать правильно?
Раздел: AVR
Имею задачу сделать 10 ШИМ со следующими характеристиками:
— Кол-во шагов 1000
— Минимальная длинна импульса 10us
— Максимальная длинна импульса 1000us
— Тактовая чистота 100Hz
Решать задачу я принялся через 8-ми битный таймер.
Вот пример кода
// Atmega88PU
#include <avr/io.h>
#define F_CPU 8000000
#include <avr/interrupt.h>
#include <util/delay.h>
void configure_pwm() {
TIMSK0 |= (1 << TOIE0); // Enable overflow interrupt
TCCR0A |= (1<<WGM00) | (1<<WGM01);
TCCR0B |= (1<<CS00); // divide by as is
sei();
}
int main(void) {
configure_pwm();
for (;;) {
continue;
}
}
volatile uint8_t pwm_speed[4] = {0};
volatile uint8_t pwm_pin[4] = {PORTC4, PORTD2, PORTD4, PORTD6};
volatile uint8_t * pwm_port[] = {&PORTC, &PORTD, &PORTD, &PORTD};
volatile uint8_t counter = 0x0;
ISR(TIMER0_OVF_vect)
{
if (counter == 0xFF) {
counter = 0x0;
for (int i=0;i<=4;i++) {
if (pwm_speed[i] != 0x00) {
*pwm_port[i] |= (1 << pwm_pin[i]);
}
}
return;
}
for (int i=0;i<=4;i++) {
if (pwm_speed[i] == counter) {
*pwm_port[i] |= (0 << pwm_pin[i]);
}
}
counter++;
}
Ввиду того что новичок в С и в AVR то имею ряд вопросов:
1) Правильно ли я делаю?
2) Не будет ли отжирать 99.9% процесорного времени данная конструкция ?
3) Как делать правильно?
Раздел: AVR