Страница 1 из 1

Нужна помощь в расчетах ШИМ. ATtiny13A, язык С.

Добавлено: Чт фев 28, 2013 15:42:59
cyxapev
Есть две сервы HXT900 и ATtiny13A.
Нужно: при получении "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
            }
        }  

        } // закрывающая скобка бесконечного цикла

   } // закрывающая скобка основной программы
Объясните как рассчитать максимальное и минимальное значения, если микро работает в диапазоне 800-2200мкс.
t - шаг, tmin - 0,8мс, tmax - 2,2мс.