|  | roboforum.ruТехнический форум по робототехнике. |  | 

avr123.nm.ru писал(а): Вашим моторчиком можно плавно управлять как раз так как вы читали в задаче 8 -


Вы говорите что моторчиком можно плавно управлять. Т.е вы хотите сказать что можно сделать так что бы колеса машинки не резко в право влево, а медленно поворачивались? Если так, то скажите пожалуйста, какая примерно нужна для этого величина ШИМ, или же нужно что бы величина ШИМ менялась? Т.е возможно при старте чтоб сдвинуть мотор с места нужно ШИМ 100%, а потом резко уменьшить допустим до 20% что бы колеса медленно крутились?


/*
Code Vision AVR C Compiler
MCU atmega16
CLOCK 8 MHz RC INT
*/
#include<mega16.h>
#define TOP 10000
void servo1_position(int pos)
{
OCR1A = pos/2;
}
 
void servo2_position(int pos)
{
OCR1B = pos/2;
}
 
void main(void)
{
//настраиваем Timer1
TCCR1A=0xA0;
TCCR1B=0x12;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=(char)TOP>>8;
ICR1L=(char)TOP //максимальное значение таймера
OCR1B=0x00;
OCR1A=0x00;
 
DDRD=0x30; //PORTD4 & PORTD5 сконфигурированы на выход
 
servo1_position(1000); //на PD5 появится ШИМ с частотой 50 гц и длительностью имлуьса 1000 мксек
servo2_position(1300); //на PD4 аналогично, но длительность импульса уже 1300 мксек
while(1);
}

...
//global variables
uint8_t servo_position;//содержит текущее положение сервопривода, просто запишите в него нужное значение
...
//начальная инициализация
void init(){
...
sei();
servo_position=172; //сервопривод в среднее положение
DDRD|=1<<servo_pwm; //пин OC2 на выход
OCR2=0xFF; //пин OC2 Timer2 автоматически установится, когда таймер досчитает до OCR2=255
TIMSK|=1<<TOIE2; // активируем прерывание Timer2 overflow
TCCR2=0b00110111; // ck/1024, normal mode, set OC2 on compare
/*первым наступит прерывание Timer2 overflow, при этом пин OC2 автоматически установится потому что 
в настройках таймера задана "установка OC2 при равенстве TCNT2=OCR2=255", вручную устанавливать не надо.*/
...
}
...
//ПРЕРЫВАНИЯ
//=================Timer2 overwlow interrupt================
ISR(TIMER2_OVF_vect){
TCCR2=0b00100101; // предделитель ck/128, normal mode, clear OC2 on compare
// при F_CPU=14.7456Мгц один тик таймера 8,6784мкс
OCR2=servo_position; //задаем ширину управляющего импульса
TCNT2=0;
TIFR|=1<<OCF2; //сбрасываем флаг OCF2, флаг TOV2 сбросится при выходе из прерывания
TIMSK|=1<<OCIE2; // активируем прерывание Timer2 compare
TIMSK&=~(1<<TOIE2); // дизактивируем прерывание Timer2 overflow
}
//=================Timer2 compare match interrupt================
ISR(TIMER2_COMP_vect){
TCCR2=0b00110111; // предделитель ck/1024, normal mode, set OC2 on compare
OCR2=0xFF; //счет до 255 даст задержку ~17мс
TCNT2=0;
TIFR|=1<<TOV2; //сбрасываем флаг TOV2, флаг OCF2 сбросится при выходе из прерывания
TIMSK|=1<<TOIE2; // активируем прерывание Timer2 overflow
TIMSK&=~(1<<OCIE2); // дизактивируем прерывание Timer2 compare
}
...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0