Atmega2560 舵机PWM控制
舵机Servo 示意图
舵机控制原理
使用芯片:Atmega 2560
晶振: 16MHz
产品: freenove_Carwling_Robot
目标:用16位的四个定时器1,3,4,5分别产生PWM控制12个舵机。由于舵机的控制并不是PWM的硬件连接,所以这里要使用软件中断来控制
程序:
#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 16000000UL
#include <util/delay.h>
// ********************************************************************************
// Interrupt Routines
// ********************************************************************************
#define scale 180
#define RF_wrist_def 170*182
#define RF_elbow_def 110*182 //minus up
#define RF_shoulder_def 127*182
#define LF_wrist_def 100*182 // inc dn
#define LF_elbow_def 150*182 //inc up
#define LF_shoulder_def 130*182 //inc cw
#define RR_wrist_def 170*182
#define RR_elbow_def 110*182
#define RR_shoulder_def 90*182
void timer_init(void) {
// timer1 init
TIMSK1= (1<<TOIE1) | (1<<OCIE1A) | (1<<OCIE1B) | (1<<OCIE1C);
TCCR1B |= (1 << CS10) ;// turn on 16 bit timer1 also with /1024
TIMSK3= (1<<TOIE3) | (1<<OCIE3A) | (1<<OCIE3B) | (1<<OCIE3C);
TCCR3B |= (1 << CS30) ;// turn on 16 bit timer1 also with /1024
}
ISR(TIMER1_OVF_vect) {
// timer1 overflow
PORTA |= 0b00000111;