📄 pwm.c
字号:
#include "PWM.h"
uchar baseTimeCounter = 0; // 定时器0的基本定时时间
uchar steeringEngineAngle = STEERING_ENGINE_ANGLE; //角度标识
/******************************************************************
- 功能描述:1ms精度的延迟函数
- 参数说明:
- 返回说明:
- 示例:
- 修改记录:
- 注意事项:适用于11.0592M的晶振频率。
******************************************************************/
void Delay_1ms(uint ms)//延时
{
uint i, j;
for (i=0; i<ms; i++)
{
for (j=0; j<125; j++);
}
}
/******************************************************************
- 功能描述:设定定时器0的定时时间为0.5ms
- 参数说明:
- 返回说明:
- 示例:
- 修改记录:
- 注意事项:适用于11.0592M的晶振频率。
******************************************************************/
void Init_Timer0(void) //定时器初始化
{
// 设定定时器0工作在方式1(16位定时器模式)
TMOD = 0x01;
// 设定定时器0的定时时间
TH0 = (65535-460)/256;
TL0 = (65535-460)%256; //11.0592MZ晶振,0.5ms
// 开中断
ET0 = 1;
EA = 1;
// 开启定时器
TR0 = 1;
}
/******************************************************************
- 功能描述:产生所需要的PWM波
- 参数说明:
- 返回说明:
- 示例:
- 修改记录:
- 注意事项:适用于11.0592M的晶振频率。
******************************************************************/
void Timer0_Interrupt() interrupt 1 //中断程序
{
// 重载定时器0
TH0 = (65535-460)/256;
TL0 = (65535-460)%256;
if (baseTimeCounter < steeringEngineAngle) //判断0.5ms次数是否小于角度标识
{
PWM0 = 1; //确实小于,PWM输出高电平
}
else
{
PWM0 = 0; //大于则输出低电平
}
baseTimeCounter += 1; //0.5ms次数加1
if (baseTimeCounter == 40)
{
baseTimeCounter = 0;
}
}
/******************************************************************
- 功能描述:通过按键调整PWM波的占空比->舵机的角度
- 参数说明:
- 返回说明:
- 示例:
- 修改记录:
- 注意事项:每次增加/减少的角度为45°
******************************************************************/
void KeyScan(void) //按键扫描
{
#if (ADJUST_STEERING_ENGINE_MODE == KEY_SET_POINT)
{
// 增加角度
if (KEY1 == 0) // 角度增加按键是否按下
{
Delay_1ms(10); // 延时消抖
if (KEY1 == 0) // 确实按下
{
baseTimeCounter = 0; // 按键按下 则20ms周期从新开始
steeringEngineAngle++; // 高电平时间增加0.5ms->角度增加45°
if(steeringEngineAngle == 12)
{
steeringEngineAngle = 11; // 已经是180度,则保持
}
while (KEY1 == 0); // 等待按键放开
}
}
// 减少角度
if (KEY2 == 0) // 角度减小按键是否按下
{
Delay_1ms(10); // 延时消抖
if (KEY2 == 0)
{
baseTimeCounter = 0;
steeringEngineAngle--; // 角度标识减1
if(steeringEngineAngle==0)
{
steeringEngineAngle=1; // 已经是0度,则保持
}
while (KEY2 == 0); // 等待按键放开
}
}
}
#endif
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -