完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
以下是我们老师给我的的一个程序(也算是个讲义)关于驱动步进电机。他要求我们将一下程序中 使步进电机正转与反转的两步程序改写成一个程序, 提示是增加一个参数。 我没有学过编程,实在不会啊,请教各位大神帮忙 ,谢啦。
/********************************************************************** C51_StepCtl.c 生成(有转角参数和速度参数的)模块化的减速永磁步进电机驱动函数 用端口P2的低四位驱动第一台减速永磁步进电机 单片机 P2.0 引脚接驱动板输入脚 In1 (控制第一台电机的线圈A) 单片机 P2.1 引脚接驱动板输入脚 In2 (控制第一台电机的线圈B) 单片机 P2.2 引脚接驱动板输入脚 In3 (控制第一台电机的线圈C) 单片机 P2.3 引脚接驱动板输入脚 In4 (控制第一台电机的线圈D) 用端口P2的高四位驱动第二台减速永磁步进电机 单片机 P2.4 引脚接驱动板输入脚 In1 (控制第二台电机的线圈A) 单片机 P2.5 引脚接驱动板输入脚 In2 (控制第二台电机的线圈B) 单片机 P2.6 引脚接驱动板输入脚 In3 (控制第二台电机的线圈C) 单片机 P2.7 引脚接驱动板输入脚 In4 (控制第二台电机的线圈D) 用延时函数控制步进电机相位变化的频率 采用单双相八拍步序信号驱动 -> 0xF9 -> 0xF1 -> 0xF3 -> 0xF2 -> 0xF6 -> 0xF4 -> 0xFC -> 0xF8 -> ------------------------------------------------------------------ 二进制数位 1 使得对应的线圈导电, 同时使该数位上的发光二极管暗 November 27, 2012 **********************************************************************/ #include unsigned char paramSpd; // 循环内的延时参数 unsigned char paramItv; // 两次操作之间的延时参数 void delayms(unsigned char ms); // 申明延时程序程序 void mt1_cw(unsigned char angUnits, unsigned char spdParam); void mt1_ccw(unsigned char angUnits, unsigned char spdParam); void mt2_cw(unsigned char angUnits, unsigned char spdParam); void mt2_ccw(unsigned char angUnits, unsigned char spdParam); void mt1cw_basic(unsigned char spd); void mt1ccw_basic(unsigned char spd); void mt2cw_basic(unsigned char spd); void mt2ccw_basic(unsigned char spd); //******************************** 主程序 ******************************* void main() { paramSpd = 15; // 循环内延时参数赋值 paramItv = 80; // 两次操作之间的延时参数赋值 while (1) { mt1_cw(100, paramSpd); // 驱动第一台电机正向旋转16个八个节拍 delayms(paramItv); // 停顿一段时间 mt2_cw(0, paramSpd); // 驱动第二台电机正向旋转16个八个节拍 delayms(paramItv); // 停顿一段时间 mt2_ccw(0, paramSpd); // 驱动第一台电机反向旋转16个八个节拍 delayms(paramItv); // 停顿一段时间 mt1_ccw(100, paramSpd); // 驱动第二台电机反向旋转16个八个节拍 delayms(paramItv); // 停顿一段时间 } } //***************************** 驱动第一台电机正向旋转 ********************************* void mt1_cw(unsigned char angUnits, unsigned char spdParam) { while(angUnits--) { mt1cw_basic(spdParam); } } void mt1cw_basic(unsigned char spd) { P2 = 0xF9; // 第一节拍 ( 1111 1001 线圈 D 和 线圈 A 同时导电) delayms(spd); P2 = 0xF1; // 第二节拍 ( 1111 0001 线圈 A 单独导电) delayms(spd); P2 = 0xF3; // 第三节拍 ( 1111 0011 线圈 B 和 线圈 A 同时导电) delayms(spd); P2 = 0xF2; // 第四节拍 ( 1111 0010 线圈 B 单独导电) delayms(spd); P2 = 0xF6; // 第五节拍 ( 1111 0110 线圈 C 和 线圈 B 同时导电) delayms(spd); P2 = 0xF4; // 第六节拍 ( 1111 0100 线圈 C 单独导电) delayms(spd); P2 = 0xFc; // 第七节拍 ( 1111 1100 线圈 D 和 线圈 C 同时导电) delayms(spd); P2 = 0xF8; // 第八节拍 ( 1111 1000 线圈 D 单独导电) delayms(spd); } //***************************** 驱动第一台电机反向旋转 ********************************* void mt1_ccw(unsigned char angUnits, unsigned char spdParam) { while(angUnits--) { mt1ccw_basic(spdParam); } } void mt1ccw_basic(unsigned char spd) { P2 = 0xFc; // 第一节拍 ( 1111 1100 线圈 D 和 线圈 C 同时导电) delayms(spd); P2 = 0xF4; // 第二节拍 ( 1111 0100 线圈 C 单独导电) delayms(spd); P2 = 0xF6; // 第三节拍 ( 1111 0110 线圈 C 和 线圈 B 同时导电) delayms(spd); P2 = 0xF2; // 第四节拍 ( 1111 0010 线圈 B 单独导电) delayms(spd); P2 = 0xF3; // 第五节拍 ( 1111 0011 线圈 B 和 线圈 A 同时导电) delayms(spd); P2 = 0xF1; // 第六节拍 ( 1111 0001 线圈 A 单独导电) delayms(spd); P2 = 0xF9; // 第七节拍 ( 1111 1001 线圈 D 和 线圈 A 同时导电) delayms(spd); P2 = 0xF8; // 第八节拍 ( 1111 1000 线圈 D 单独导电) delayms(spd); } //***************************** 驱动第二台电机正向旋转 ********************************* void mt2_cw(unsigned char angUnits, unsigned char spdParam) { while(angUnits--) { mt2cw_basic(spdParam); } } void mt2cw_basic(unsigned char spd) { P2 = 0x9F; // 第一节拍 ( 1111 1001 线圈 D 和 线圈 A 同时导电) delayms(spd); P2 = 0x1F; // 第二节拍 ( 1111 0001 线圈 A 单独导电) delayms(spd); P2 = 0x3F; // 第三节拍 ( 1111 0011 线圈 B 和 线圈 A 同时导电) delayms(spd); P2 = 0x2F; // 第四节拍 ( 1111 0010 线圈 B 单独导电) delayms(spd); P2 = 0x6F; // 第五节拍 ( 1111 0110 线圈 C 和 线圈 B 同时导电) delayms(spd); P2 = 0x4F; // 第六节拍 ( 1111 0100 线圈 C 单独导电) delayms(spd); P2 = 0xcF; // 第七节拍 ( 1111 1100 线圈 D 和 线圈 C 同时导电) delayms(spd); P2 = 0x8F; // 第八节拍 ( 1111 1000 线圈 D 单独导电) delayms(spd); } //***************************** 驱动第二台电机反向旋转 ********************************* void mt2_ccw(unsigned char angUnits, unsigned char spdParam) { while(angUnits--) { mt2ccw_basic(spdParam); } } void mt2ccw_basic(unsigned char spd) { P2 = 0xcF; // 第一节拍 ( 1111 1100 线圈 D 和 线圈 C 同时导电) delayms(spd); P2 = 0x4F; // 第二节拍 ( 1111 0100 线圈 C 单独导电) delayms(spd); P2 = 0x6F; // 第三节拍 ( 1111 0110 线圈 C 和 线圈 B 同时导电) delayms(spd); P2 = 0x2F; // 第四节拍 ( 1111 0010 线圈 B 单独导电) delayms(spd); P2 = 0x3F; // 第五节拍 ( 1111 0011 线圈 B 和 线圈 A 同时导电) delayms(spd); P2 = 0x1F; // 第六节拍 ( 1111 0001 线圈 A 单独导电) delayms(spd); P2 = 0x9F; // 第七节拍 ( 1111 1001 线圈 D 和 线圈 A 同时导电) delayms(spd); P2 = 0x8F; // 第八节拍 ( 1111 1000 线圈 D 单独导电) delayms(spd); } //********************************* 延时子程序 ********************************* void delayms(unsigned char ms) { unsigned char j; unsigned char k; while(ms--) { for(j = 0; j < 10; j++) { for(k = 0; k < 10; k++); } } } |
|
相关推荐
1个回答
|
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
【瑞萨RA6E2】瑞萨E2S软件安装过程,等待过程玩下97_e2 studio_ZGZZ
234 浏览 0 评论
514 浏览 0 评论
【原创】【RA4M2-SENSOR开发板评测】低功耗+USB综合测试
826 浏览 0 评论
1366 浏览 2 评论
814 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
16911 浏览 31 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-3 05:00 , Processed in 0.670981 second(s), Total 71, Slave 54 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
7738