完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在图中为驱动步进电机的程序,如果直接给beats = 4076;则电机转动一周,但是如果运算的话beats = (360*4076)/360;则电机抖动一下就不动了。求大神解释,谢谢!
|
|
相关推荐
16个回答
|
|
|
|
|
|
补充:芯片为STC89C52RC
|
|
|
|
4076改为4076l
|
|
|
|
beats =(u32) (360*4076)/360试试?或者beats定义u32
|
|
|
|
为什么啊……
|
|
|
|
初始定义 unsigned long beats
|
|
|
|
常数默认是整型
|
|
|
|
把程序给全了吧,定义有问题,转数也有问题。
|
|
|
|
大神,请问一下越界是什么意思呢?
|
|
|
|
大神,你的方法我试过了,确实可行,谢谢!但是我有一个疑问,为什么不可行的程序放到函数里就可行,不越界呢?
|
|
|
|
#include
unsigned long beats = 0; void StartMotor(unsigned long angle); void main() { EA = 1; TMOD = 0x01; TH0 = 0xf8; TL0 = 0xcd; ET0 = 1; TR0 = 1; StartMotor(360); while (1) {}; } void StartMotor(unsigned long angle) { EA = 0; beats = (angle*4076)/360; EA = 1; } void InterruptTimer0() interrupt 1 { unsigned char tmp; static unsigned char index = 0; unsigned char code BeatCode[8] = { 0x0E, 0x0C, 0x0D, 0x09, 0x0B, 0x03, 0x07, 0x06}; TH0 = 0xf8; TL0 = 0xcd; if(beats != 0) { tmp = P1; tmp = tmp & 0xf0; tmp = tmp | BeatCode[index]; P1 = tmp; index++; index = index & 0x07; beats--; } else { P1 = P1 | 0x0f; } } 这是原程序,可行 |
|
|
|
因为你这个使用了我说的第一个方法,其中一个数字后面加 l
|
|
|
|
4076l是什么意思...
|
|
|
|
可行是因为你定义了一个长整形型变量,这样这个计算就不会在编译时计算,而是运行时计算,而运行时是按你最大的数据类型预留RAM的。
|
|
|
|
常量 4067是长整型l=LONG
|
|
|
|
数据类型的问题,估计360*4067的结果超出了你所定义的beats的类型,原程序中beats是long型,看看你的程序里定义的是什么类型
|
|
|
|
只有小组成员才能发言,加入小组>>
3318 浏览 9 评论
2995 浏览 16 评论
3494 浏览 1 评论
9063 浏览 16 评论
4088 浏览 18 评论
1183浏览 3评论
609浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
601浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2336浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1897浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 01:07 , Processed in 1.172072 second(s), Total 107, Slave 88 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号