/*********************************************************
编写人:施海盛
单片机:AVR mega128
编译软件:ICC7.14
**********************************************************/
/*************************************************************
tc1 PWM 相位频率可调模式 控制舵机转动
PORTB.5(OC1A),PORT.6(OC1B) PWM输出,
周期20ms,OC1B高电平脉宽在1.2和1.8ms交替变化,
改变占空比只需要直接改变比较输出寄存器OCR1B的值即可
占空比 k=OCR1B/TOP=600/10000 设置
频率:f=8000000/2*N*TOP=50Hz
N=8 8分频 TOP=10000;
TOP为计数器最大值 通过ICR1=10000;设置
外部8MHZ晶振 定时器8分频,注意延时程序与晶振大小的关系
测试PWM信号一开始不要用1ms和2ms这种边界条件,存在误差的话舵机可能无响应
***********************************************************/
#include <iom128v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
/*******************延时函数*********************/
void delay_ms(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<(uint)(16*145-2);j++);
}
/*****************端口初始化******************/
void io_init(void)
{
DDRB|=0xe0;
DDRE|=0x38;
TCCR1A=(1<<COM1A1)|(1<<COM1C1)|(1<<COM1B1); // //,输出PWM
TCCR1B=(1<<WGM13)|(1<<CS11); // PWM
TCCR3A=(1<<COM3A1)|(1<<COM3C1)|(1<<COM3B1); // //,输出PWM
TCCR3B=(1<<WGM33)|(1<<CS31); // PWM
ICR1=20000; //50Hz=20ms: 50Hz*TOP*8=16000000Hz :设定周期为20ms
ICR3=20000;
}
void Set_z(void)
{
OCR1A=1560;
OCR1B=1620;
OCR1C=1470;
OCR3A=1500;
OCR3B=1500;
OCR3C=1550;
delay_ms(1500);
}
/********************主函数**********************/
void main(void)
{
io_init(); //端口初始化
//time1_init(); //定时器1初始化
Set_z();
while(1)
{
OCR1B=600;
delay_ms(1000);
OCR1B=1000;
delay_ms(500);
OCR1B=1500;
delay_ms(1000);
OCR1B=2000;
delay_ms(1000);
OCR1B=2250;
delay_ms(1000);
OCR1B=1700;
delay_ms(1000);
OCR1B=1100;
delay_ms(1000);
OCR1B=600;
delay_ms(1000);
}
}