用52单片机驱动电机,把while语句改成for语句,电机不转了
本帖最后由 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
divab
movr0,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端跟单片机端口的电路这样子是否有问题啊,怎样子电平才够低啊
http://img.hb.aicdn.com/f5766ca8e24d1519196319112d4ed717ee90a961110e9-pLL2xc_fw554 TimeCount用long类型,int的话,在51里只有16位,最大值才32768 dysxq 发表于 2013-1-5 21:51 static/image/common/back.gif
TimeCount用long类型,int的话,在51里只有16位,最大值才32768
我使用的是unsigned int的类型 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(1); //少了這個程序停不住...
} 楼上正解{:lol:} dlmaowf 发表于 2013-1-6 10:25 static/image/common/back.gif
楼上正解
为什么呢?我在后面加了while(1);这条语句,电机还是不会动 是不是电机转起来需要一个加速的过程啊? 你的for循环是发40000个脉冲,你先尝试把延迟时间改的长一些,看看马达会不会运转 黄金圣斗士级程序员
for(TimeCount = 0; TimeCount < 40000; TimeCount++){
改成
for(TimeCount = 0; TimeCount < 40000 || TimeCount >= 40000 ; TimeCount++){ dlmaowf 发表于 2013-1-6 10:52 static/image/common/back.gif
你的for循环是发40000个脉冲,你先尝试把延迟时间改的长一些,看看马达会不会运转 ...
我把延时时间改长了也不行 {:sad:}这个问题,看程序也不难啊,你不会就这么一点程序吧,全部贴出来,让大家看看呢 gaolf_2012 发表于 2013-1-6 12:00 static/image/common/back.gif
黄金圣斗士级程序员
for(TimeCount = 0; TimeCount < 40000; TimeCount++){
改成
这样不是相当于死循环吗?我的想法是想让电机转一段时间停下来啊 dlmaowf 发表于 2013-1-6 12:42 static/image/common/back.gif
这个问题,看程序也不难啊,你不会就这么一点程序吧,全部贴出来,让大家看看呢 ...
贴出来了 转完了for循环就转完了需要加一个死循环吧 没看懂那个us的延迟程序 dlmaowf 发表于 2013-1-6 13:04 static/image/common/back.gif
没看懂那个us的延迟程序
那个延时程序是参考这里的的 for外面几个while
jiaohaitao 发表于 2013-1-6 13:32 static/image/common/back.gif
for外面几个while
for外面没有啊,在for语句外面添加while啊 4楼解决的是,电机转动停不下来。
电机为什么会不转呢? 楼主再检查一下硬件和接线,再改回while试试还行不? timeCount改long型再延长一些试试
页:
[1]