本帖最后由 cc_maple 于 2013-1-6 14:52 编辑
单片机是AT89S52,用单片机通过Pulse和Dir端口控制电机驱动器,然后电机驱动器再驱动2相57步进电机
刚开始的代码是这样的:
- void main()
- {
- DelayMs(100);
- DIR = 0;
- DelayMs(100);
- PUL = 1;
- while(1){
- PUL = 1;
- delay_even_us(100);
- PUL = 0;
- delay_even_us(100);
- }
-
- }
复制代码DelayMs() delay_even_us()分别是延时函数,DIR, PUL为单片机P0口端口
然后改成这样:
- void main()
- {
- DelayMs(100);
- DIR = 0;
- DelayMs(100);
- PUL = 1;
- for(TimeCount = 0; TimeCount < 40000; TimeCount++){
- PUL = 1;
- delay_even_us(100);
- PUL = 0;
- delay_even_us(100);
- }
-
- }
复制代码我的想法是让电机转一段时间就停止,就套用了循环,但是发现电机根本不会转,这个到底是什么原因啊?
完整的代码,主函数里使用的是while语句
- /*****************************
- *Date:2012.12.9
- *Function:电机信号控制,控制减速电机来回移动
- *晶振:11.0596MHz
- *****************************/
- #include <intrins.h>
- #include <reg52.h>
- sbit PUL = P1^0;
- sbit DIR = P1^1;
- unsigned int TimeCount = 0;
- /*
- *延时函数, 对于11.0592MHz时钟, 例i=10,则大概延时10ms
- */
- void DelayMs(unsigned int i)
- {
- unsigned int j;
- while(i--)
- {
- for(j = 0; j < 125; j++);
- }
- }
- /*
- *延时函数, 精确延时偶数个us(是在晶振为12MHz的情况下)
- */
- void delay_even_us(unsigned char even)
- {
- #pragma asm
- mov a, r7
- subb a,#10H
- mov b,#02H
- div ab
- mov r0,a
- nop
- loop:
- djnz r0,loop
- #pragma endasm
- }
- void main()
- {
- DelayMs(100);
- DIR = 0;
- DelayMs(100);
- PUL = 1;
- while(1){
- PUL = 1;
- delay_even_us(100);
- PUL = 0;
- delay_even_us(100);
- }
- }
复制代码____________________________________________________________________
PS:我用示波器看了下,发现单片机端口虽然输出低电平,但感觉低电平输出太低了,电机驱动器跟单片机的连接如下,PUL端跟单片机端口的电路这样子是否有问题啊,怎样子电平才够低啊
for(TimeCount = 0; TimeCount < 40000; TimeCount++){
改成
for(TimeCount = 0; TimeCount < 40000 || TimeCount >= 40000 ; TimeCount++){
我把延时时间改长了也不行
这样不是相当于死循环吗?我的想法是想让电机转一段时间停下来啊
贴出来了
一周热门 更多>