完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
proteus模拟
电机内部数据参数,初始的即可,不用调改。 整体程序的结果: (1)先正转一圈,等待一秒后再反转一圈。这一过程可以自己修改程序,把它去掉,即整体main函数while循环的前面那部分,只会执行一次。 while(1) { (2)按下按钮1,整个电机开始正转N圈,当检测按钮一直按下时,整个电机就一直正转下去。当检测到其他按钮按下时,立即跳转到其他按钮对应的程序。 (3)按下按钮2,和按钮1相反。 (4)按钮3,使整个电机停止工作。 } 上面2,3,4部分是一直在循环扫描检测的。 程序代码 #include #include unsigned char code z[]={0x02,0x06,0x04,0x0c,0x08,0x09,0x01,0x03//315,270,225......360(0) };//八拍 unsigned char code f[]={0x01,0x09,0x08,0x0c,0x04,0x06,0x02,0x03//45,90,145......360(0) }; ***it K1 = P3^0;//定义正转按钮 ***it K2 = P3^1;//定义反转按钮 ***it K3 = P3^2;//定义停止按钮 void zz(unsigned char n); void fz(unsigned char n); void delay(); void step(); void main() { unsigned char N = 1;//由于设定好了转一圈的数据,所以N在此设定为转多少圈。 TMOD=0X10; TL1=0XF0; TH1=0XD8; EA=0; ET1=0;//这里没有使用定时器中断,这里只是使用定时器的定时功能。 zz(N); delay(); fz(N); while(1) { if(K1 == 0) { while(1) { P0 = 0xfe; zz(N); if(K3 == 0||K2==0) break; } } else if(K2 == 0) { while(1) { P0 = 0xfd; fz(N); if(K3 == 0||K1==0) break; } } else { P0 = 0xfb; P1 = 0x03; } } } void zz(unsigned char n)//正转 { unsigned char i,j; for(i=0;i for(j=0;j<8;j++)//整个for循环,正转一个步距角,因为四相八拍,所以是半个步距角,即半步。 { if(K3 == 0) break; P1 = z[j]; step(); } } } void fz(unsigned char n)//反转 { unsigned char i,j; for(i=0;i for(j=0;j<8;j++) { if(K3 == 0) break; P1 = f[j]; step(); } } } void delay()//定义1s { unsigned char i,j,k; _nop_(); i=8; j=154; k=122; do { do { while(--k); }while(--j); }while(--i); } void step()//定时器计时10ms { TF1=0; TR1=1; while(TF1==0); TR1=0; TL1=0XF0; TH1=0XD8; } 关于一些实验过程中的说法 1.程序中用到的延时,这个根据自己的习惯,可以写相对应的函数延时,但是由于电机转的过程中的延时,就我上文中for循环里面的定时10ms,这个是根据实际情况来调的,理论上来说,使用proteus仿真的电机延时最低是1ms,如果低于1ms实验起来,不会看到自己编写代码的理想结果。 2.步距角的不同,那么想要电机转一圈,执行zz或者fz函数的参数就要有所不同。以我上面程序为例。 八拍转一个循环,转过360度,步距角是90°。 那么步距角是45°时,要想转过360°,那么就需要16拍。 这里需要各位自己去修改程序去实验,这里只提供一个提醒。如果超过256拍的话,那么unsigned char是不够你玩的,需要unsigned int。 |
|
|
|
proteus模拟
电机内部数据参数,初始的即可,不用调改。 整体程序的结果: (1)先正转一圈,等待一秒后再反转一圈。这一过程可以自己修改程序,把它去掉,即整体main函数while循环的前面那部分,只会执行一次。 while(1) { (2)按下按钮1,整个电机开始正转N圈,当检测按钮一直按下时,整个电机就一直正转下去。当检测到其他按钮按下时,立即跳转到其他按钮对应的程序。 (3)按下按钮2,和按钮1相反。 (4)按钮3,使整个电机停止工作。 } 上面2,3,4部分是一直在循环扫描检测的。 程序代码 #include #include unsigned char code z[]={0x02,0x06,0x04,0x0c,0x08,0x09,0x01,0x03//315,270,225......360(0) };//八拍 unsigned char code f[]={0x01,0x09,0x08,0x0c,0x04,0x06,0x02,0x03//45,90,145......360(0) }; ***it K1 = P3^0;//定义正转按钮 ***it K2 = P3^1;//定义反转按钮 ***it K3 = P3^2;//定义停止按钮 void zz(unsigned char n); void fz(unsigned char n); void delay(); void step(); void main() { unsigned char N = 1;//由于设定好了转一圈的数据,所以N在此设定为转多少圈。 TMOD=0X10; TL1=0XF0; TH1=0XD8; EA=0; ET1=0;//这里没有使用定时器中断,这里只是使用定时器的定时功能。 zz(N); delay(); fz(N); while(1) { if(K1 == 0) { while(1) { P0 = 0xfe; zz(N); if(K3 == 0||K2==0) break; } } else if(K2 == 0) { while(1) { P0 = 0xfd; fz(N); if(K3 == 0||K1==0) break; } } else { P0 = 0xfb; P1 = 0x03; } } } void zz(unsigned char n)//正转 { unsigned char i,j; for(i=0;i for(j=0;j<8;j++)//整个for循环,正转一个步距角,因为四相八拍,所以是半个步距角,即半步。 { if(K3 == 0) break; P1 = z[j]; step(); } } } void fz(unsigned char n)//反转 { unsigned char i,j; for(i=0;i for(j=0;j<8;j++) { if(K3 == 0) break; P1 = f[j]; step(); } } } void delay()//定义1s { unsigned char i,j,k; _nop_(); i=8; j=154; k=122; do { do { while(--k); }while(--j); }while(--i); } void step()//定时器计时10ms { TF1=0; TR1=1; while(TF1==0); TR1=0; TL1=0XF0; TH1=0XD8; } 关于一些实验过程中的说法 1.程序中用到的延时,这个根据自己的习惯,可以写相对应的函数延时,但是由于电机转的过程中的延时,就我上文中for循环里面的定时10ms,这个是根据实际情况来调的,理论上来说,使用proteus仿真的电机延时最低是1ms,如果低于1ms实验起来,不会看到自己编写代码的理想结果。 2.步距角的不同,那么想要电机转一圈,执行zz或者fz函数的参数就要有所不同。以我上面程序为例。 八拍转一个循环,转过360度,步距角是90°。 那么步距角是45°时,要想转过360°,那么就需要16拍。 这里需要各位自己去修改程序去实验,这里只提供一个提醒。如果超过256拍的话,那么unsigned char是不够你玩的,需要unsigned int。 |
|
|
|
只有小组成员才能发言,加入小组>>
2443 浏览 0 评论
9131 浏览 4 评论
36808 浏览 19 评论
5033 浏览 0 评论
24793 浏览 34 评论
1544浏览 2评论
1763浏览 1评论
2212浏览 1评论
1569浏览 0评论
542浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 11:48 , Processed in 1.158227 second(s), Total 50, Slave 44 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (威廉希尔官方网站 图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号