- 打卡等级:以坛为家II
- 打卡总天数:493
- 最近打卡:2025-05-01 08:31:58
荣誉版主
- 积分
- 3476
|
擎天柱控制SG90舵机实验
本实验非常简单, 但不失趣味和参考意义。
首先说说SG90舵机:
这是可旋转0-180度的舵机。
硬件引脚简单,仅三脚:1-GND(接地)2-VCC(接正电源5V)3-PWM(控制信号线);
脉宽控制角度: 高电平脉宽0.5ms对应0度,高电平脉宽2.5ms对应180度。 周期20-25ms即可。
说到PWM脉宽控制,自然想到单片机的PWM输出功能。
本实验仅使用定时器中断计数方式,而不采用硬件PWM输出功能。
因此,不必研究单片机的PWM各种寄存器的定义和使用,不必关心单片机的引脚是否具有PWM功能;
所以,非常便于移植,可使用于任何具有定时器功能的单片机上。
擎天柱核心板当然是可以胜任的。
接线如图:
主程序及全部代码:
//----------------------------------------------------------------
// 文件: Main.C
// 功能: 擎天柱核心板控制SG90舵机实验
// MCU : AI8051U
// 舵机: 接P52端(舵机脉冲端)
// 键盘: K32 = P32,K33 = P33
// 使用: 短按一键:正转(或反转)4.5°/长按一键:正转至180°或反转至0°
// 备注: 下载时选择时钟: 30MHZ
// 编程: 浦晓明(浦江一水) 2025-03-04 for 国芯论坛
//----------------------------------------------------------------
#include "AI8051U.H"
//端口定义
sbit SG_PWM=P5^2; //舵机脉冲输出端
sbit K32 =P3^2; //按键1
sbit K33 =P3^3; //按键2
//键值定义
#define K32S 0x32
#define K33S 0x33
#define K32L 0x34
#define K33L 0x35
//全局变量
unsigned char PWM =29; //PWM高电平时间:初始为1.5ms_舵机转动90°
unsigned int count=0; //计数器变量
unsigned char k=0; //键值变量
//函数说明
void Timer0_Init(void); //50us秒@30MHz
unsigned char RDKEY(void); //读取按键程序
/* 延时函数 延时约 0.2ms * ms @30.000MHz */
void KeyYS(unsigned int ms)
{ unsigned int i;
while (ms)
{ ms--;
i=1500;
while(i)i--;
}
}
//主循环函数
void main(void)
{
WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1; //扩展寄存器(XFR)访问使能
CKCON = 0; //提高访问XRAM速度
P0M1 = 0x00; P0M0 = 0x00;
P1M1 = 0x00; P1M0 = 0x00;
P2M1 = 0x00; P2M0 = 0x00;
P3M1 = 0x00; P3M0 = 0x00;
P4M1 = 0x00; P4M0 = 0x00;
P5M1 = 0x00; P5M0 = 0x00;
Timer0_Init(); //定时器0初始化
while(1)
{
if(count>=400)count=0;//设舵机脉冲周期50us*400=20ms
k=0;k=RDKEY(); //按键控制
switch(k)
{ case K33S: PWM=PWM> 9?PWM-1: 9; break;
case K32S: PWM=PWM<49?PWM+1:49; break;
case K32L: PWM=49; break;
case K33L: PWM=9; break;
} KeyYS(500);
}
}
//定时器0初始化函数
//50微秒@30.000MHz
void Timer0_Init(void)
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x24; //设置定时初始值
TH0 = 0xFA; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //开始计数
EA = 1; //开启中断
}
//定时器0中断服务程序
void Timer0_Isr(void) interrupt 1 //100us中断执行一次
{
if(count<=PWM)SG_PWM=1; //脉冲高电平时间
else SG_PWM=0; //脉冲时基-高电平=低电平时间
count++;
}
//读取键值函数
unsigned char RDKEY(void)
{ unsigned char kv=0;
unsigned int ak=0; //按键延时计数
if(K32==0)
{ ak=0; KeyYS(5); //消除抖动
while((K32==0)&&(ak<500)){ ak++; KeyYS(10); } //等待键松开...
if(ak<250)kv=K32S; //返回短按键值
else kv=K32L; //返回长按键值
}
if(K33==0)
{ ak=0; KeyYS(5); //消除抖动
while((K33==0)&&(ak<500)){ ak++; KeyYS(10); }
if(ak<250)kv=K33S; //返回短按键值
else kv=K33L; //返回长按键值
}
return kv; //若无键按下则返回0
}
工程文件供有兴趣的坛友参考:
01-擎天柱控制舵机实验.rar
(134.76 KB, 下载次数: 10)
|
|