Нужна подсказка по программе к ШИМ для 2 серво. Язык С, ATtiny13A
Перейдем от болтовни к реальном примерам. Есть ATtiny13A, есть две сервы HXT900, есть пример использования ШИМ в тиньке. Исходя из этого написал следующее:
Осталось разобраться как правильно рассчитать задержки, желательно подробно, "для самых маленьких", то биш для меня.
Кстати, я еще не дописал защиту для крайнего левого и правого положения, но это уже мелочи.
PS: Тинек много, можно экспериментировать до посинения.
Перейдем от болтовни к реальном примерам. Есть ATtiny13A, есть две сервы HXT900, есть пример использования ШИМ в тиньке. Исходя из этого написал следующее:
Код:
#define F_CPU 9600000UL // Частота МК 9,6 MHz
#include <avr/io.h> // Библиотека ввода-вывода "io.h"
#include <util/delay.h> // Библиотека задержек "delay.h"
int t1, t2, t; //Тайминг первого и второго выхода, задержка
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 сконфигурировать как выходы,
// остальные как входы
while (1) { // Бесконечный цикл
OCR0A=t1; //Обрабатываем первый выход
OCR0B=t1; //Обрабатываем второй выход
//Обработка входов
if ((PINB & (1 << PB2)) == 1) //Фиксирует 1 на входе 1
{
_delay_ms(30); //Устранение "дребезга клавиш"
if ((PINB & (1 << PB2)) == 1) //Проверяем
{
t1 += t; //Увеличиваем задержку входа 1
}
}
if ((PINB & (1 << PB3)) == 1) //Фиксирует 1 на входе 2
{
_delay_ms(30); //Устранение "дребезга клавиш"
if ((PINB & (1 << PB3)) == 1) //Проверяем
{
t1 -= t; //Уменьшаем задержку входа 1
}
}
if ((PINB & (1 << PB4)) == 1) //Фиксирует 1 на входе 3
{
_delay_ms(30); //Устранение "дребезга клавиш"
if ((PINB & (1 << PB4)) == 1) //Проверяем
{
t2 += t; //Увеличиваем задержку входа 2
}
}
if ((PINB & (1 << PB5)) == 1) //Фиксирует 1 на входе 4
{
_delay_ms(30); //Устранение "дребезга клавиш"
if ((PINB & (1 << PB5)) == 1) //Проверяем
{
t2 -= t; //Уменьшаем задержку входа 2
}
}
} // закрывающая скобка бесконечного цикла
} // закрывающая скобка основной программы
Кстати, я еще не дописал защиту для крайнего левого и правого положения, но это уже мелочи.
PS: Тинек много, можно экспериментировать до посинения.
Последнее редактирование: