本帖最后由 Cortex-M0 于 2011-8-23 14:44 编辑
程序来也~~~ :lol
本10位硬件PWM的驱动DEMO示范程序,移植在《智能小车》上,增加了正反4挡速度调速,性能更超值~~~
/*----------------------------------------------------------*/
/* */
/* 中颖SH88F2051/SH88F4051无线遥控智能小车DEMO程序 */
/* */
/* 功能 :使用中断方式动态接收遥控信号,软件模拟解码, */
/* 10位硬件 PWM 控制小车运行。 */
/* */
/* A键:小车前进时加速,后退时减速,共有正反 */
/* 各4挡速度供调节,4挡快慢正转,4挡快慢 */
/* 反转,1挡停止运转。 */
/* */
/* B键:功能同上,小车前进时减速,后退时加速, */
/* 共有正反4挡速度供调节,4挡快慢正转, */
/* 4挡快慢反转,1挡停止运转。 */
/* */
/* C键:在运行时,按下小车左转,松开恢复正常运 */
/* 行,小车停止时无效。 */
/* */
/* D键:在运行时,按下小车右转,松开恢复正常运 */
/* 行,小车停止时无效。 */
/* */
/* */
/* 入口 :指定 P3.0 为无线遥控接收信号输入 */
/* 出口 :键值存 Key 中,A键=1, B键=2, C键=3, D键=4 */
/* */
/* 资源 :占用 T0 定时中断, 作为20ms定时采样 */
/* 占用 PWM 中断, 刷新 PWM 输出 */
/* 占用 INT0 中断, 作为电机运转方向动态切换 */
/* */
/* */
/* CPU : SH88F2051/SH88F4051 */
/* 晶振 : 片内16.6MHz高精度RC振荡器 */
/* 作者 : 许意义 */
/* ID : LAOXU */
/* 版本 : V1.0 */
/* 日期 : 2011.8.23 */
/* */
/*----------------------------------------------------------*/
// 关于硬件 PWM 驱动直流电机 DEMO 示范程序声明:
//
// 程序编写的比较烦琐, 可精简很多字节,但没有进行优化,本意是用该程序构架扩充成10位硬件
// PWM 输出,实现高精度的动态 PWM 电机驱动实时控制,接着继续改造,将DIY革命进行到底,
// 实现史上最“烂”的山寨伺服电机之功能,以适应21ic《两轮自平衡小车DIY》的实际需求。
//
...................................
void car_PWM_int(void) interrupt 12 using 1
{ static unsigned int PWM_10bit_bak; // 10位 PWM 输出缓冲发送区
static unsigned char PWM_Counter=0; // 10位 PWM 输出发送个数计数器
if(PWM_Counter == 0)
{ PWM_10bit_bak = PWM_10bit & 0x3ff; // 10位 PWM 发送开始,装入10位 PWM 初值至输出缓冲发送区
}
if(PWM_10bit_bak >= 26)
{ PWM_10bit_bak -= 26; // 10位 PWM输出缓冲发送区 发送数据>=26, 数据减26暂存
PWMD = 0xff; // 10位 PWM 发送一次数据0xff
}
else if(PWM_10bit_bak == 0) // 10位 PWM输出缓冲发送区 发送数据=0
{ PWMD = 0x00; // 10位 PWM 发送一次数据0x00
}
else
{ PWM_10bit_bak = 0; // 10位 PWM输出缓冲发送区 发送数据<26, 数据乘10,发送之
PWMD = (unsigned char)(PWM_10bit_bak * 10);
}
if(++PWM_Counter > 40)
{ PWM_Counter = 0; // 10位 PWM 输出发送个数计数值大于40, 清0
}
PWMCON &= Bin(11111101); // 清除 PWM 周期计数器溢出标志 PWMIF
}
................................... |