Нужна помощь в расчетах ШИМ. ATtiny13A, язык С.
Добавлено: Чт фев 28, 2013 15:42:59
Есть две сервы HXT900 и ATtiny13A.
Нужно: при получении "1" на первый порт первый движок немного повернул направо, при получении "1" на второй порт первый движок немного повернул налево, аналогично и для второго движка.
Вот что я наваял, используя за основу это:
Объясните как рассчитать максимальное и минимальное значения, если микро работает в диапазоне 800-2200мкс.
t - шаг, tmin - 0,8мс, tmax - 2,2мс.
Нужно: при получении "1" на первый порт первый движок немного повернул направо, при получении "1" на второй порт первый движок немного повернул налево, аналогично и для второго движка.
Вот что я наваял, используя за основу это:
Код: Выделить всё
#define F_CPU 9600000UL // Частота МК 9,6 MHz
#include <avr/io.h> // Библиотека ввода-вывода "io.h"
#include <util/delay.h> // Библиотека задержек "delay.h"
int t1, t2, t, tmax, tmin; //Тайминг первого и второго выхода, задержка
int main(void) // начало основой программы
{
/*Настраиваем ШИМ на микроконтроллере. Страницы 69-73 в даташите на ATtiny13
COM0A1-Fast PWM Mode - Сброс ОС0А в момент совпадения, установка ОС0А при
достижении счетчиком значения ТОР
COM0B1-Fast PWM Mode - Сброс ОС0B в момент совпадения, установка ОС0B при
достижении счетчиком значения ТОР
WGM01 - Включаем Fast PWM Mode 3
WGM00 - Включаем Fast PWM Mode 3
CS02 - Устанавливаем делитель 256*/
TCCR0A|=(1 << COM0A1)|(1 << COM0B1)|(1 << WGM01)|(1 << WGM00);
//Можно вместо этого еще так TCCR0A=A3;
TCCR0B|=(1 << CS02); //Можно вместо этого еще так TCCR0B=04;
DDRB = 0x03; // выводы PB1,PB0 порта B сконфигурировать как выходы, остальные как входы
PORTB &= ~_BV(PB2); //Притянули порт 2 к земле
PORTB &= ~_BV(PB3); //Притянули порт 3 к земле
PORTB &= ~_BV(PB4); //Притянули порт 4 к земле
PORTB &= ~_BV(PB5); //Притянули порт 5 к земле
while (1) { // Бесконечный цикл
OCR0A=t1; //Обрабатываем первый выход
OCR0B=t2; //Обрабатываем второй выход
//Обработка входов
if ((PINB & (1 << PB2)) == 1) //Фиксирует 1 на входе 1
{
_delay_ms(30); //Устранение "дребезга клавиш"
if ((PINB & (1 << PB2)) == 1) //Проверяем
{
if (t1 < tmax){ //Проверяем на корректность
t1 += t;} //Увеличиваем задержку входа 1
}
}
if ((PINB & (1 << PB3)) == 1) //Фиксирует 1 на входе 2
{
_delay_ms(30); //Устранение "дребезга клавиш"
if ((PINB & (1 << PB3)) == 1) //Проверяем
{
if (t1 > tmin){ //Проверяем на корректность
t1 -= t;} //Уменьшаем задержку входа 1
}
}
if ((PINB & (1 << PB4)) == 1) //Фиксирует 1 на входе 3
{
_delay_ms(30); //Устранение "дребезга клавиш"
if ((PINB & (1 << PB4)) == 1) //Проверяем
{
if (t2 < tmax){ //Проверяем на корректность
t2 += t;} //Увеличиваем задержку входа 2
}
}
if ((PINB & (1 << PB5)) == 1) //Фиксирует 1 на входе 4
{
_delay_ms(30); //Устранение "дребезга клавиш"
if ((PINB & (1 << PB5)) == 1) //Проверяем
{
if (t2 > tmin){ //Проверяем на корректность
t2 -= t;} //Уменьшаем задержку входа 2
}
}
} // закрывающая скобка бесконечного цикла
} // закрывающая скобка основной программы
t - шаг, tmin - 0,8мс, tmax - 2,2мс.