📄 motor.c
字号:
/*******************************************/
/* 广州天河双龙电子公司 */
/* http://www.sl.com.cn */
/*功能: PA口控制八路伺服电机。 */
/*注意:伺服电机数据线是I/O-VCC-GND */
/*******************************************/
// ATMEGA16 晶振 8MHz //
#include <iom16v.h>
#include <macros.h>
#include <diy0206.c>
#pragma interrupt_handler timer1:9
//*********************************************************************
#define delay_time 0xb1e0 //延时20 ms
//以下常量对应的角度(n为负) n90 n45 0 45 90
//const unsigned char loc_angle[10]={0x01f4,0x03e8,0x05dc,0x07d0,0x0904};
const unsigned int loc_angle[8]={0x01f4,0x03e8,0x05dc,0x07d0,0x0904,0x07d0,0x05dc,0x03e8};
unsigned char pwm_number=0; //脉冲数
unsigned char pwm_outword=1; //输出命令
unsigned int delay_timel,delay_timeh; //低电平延时时间,高电平延时时间
//********************************************************************
void timer1(void) //T0定时中断服务子程序
{
if (pwm_outword!=0x80)
{
TCNT1=delay_timeh;
PORTA=pwm_outword; //输出控制命令
pwm_outword<<=1; //控制命令左移一位
}
else
{
pwm_outword=1;
TCNT1=delay_timel;
PORTA=0x00; //输出低电平
pwm_number++; //低电平输出完成,脉冲数++
}
}
//*******************************************************************
void time1_init() //定时器初始化
{
TCCR1A=0x00;
TCCR1B=0x00; //停止定时器1
TIMSK=0x04; //TIMER1溢出中断使能
TCNT1H=0x44; //设置中断初值
TCNT1L=0x44;
SEI(); //使能全局中断
TCCR1B=0x02; //启动T1,8分频
}
//**********************************************************************
void main(void)
{
unsigned char i_temp; //临时变量
unsigned int temp; //临时变量
//********************************************************************
DDRA=0xff; //PA口输出
PORTA=0xff;
mic_startup(); //调用声控
for(i_temp=0;i_temp<10;i_temp++) //灯闪烁10次
{
PORTA=0xff; //灯灭
delay_ms(500); //延时0.5S
PORTA=0x00; //灯亮
delay_ms(500); //延时0.5S
}
time1_init();
while(1)
{
for (i_temp=0;i_temp<8;i_temp++) //8个位置依次切换
{
delay_timeh=0xffff-loc_angle[i_temp];
delay_timel=delay_time+loc_angle[i_temp]*8;
while(pwm_number<8);
pwm_number=0;
} //for 结束
} //while 结束
} //main函数结
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -