内容:1、本程序用于测试4相步进电机常规驱动
2、需要用跳帽或者杜邦线把信号输出端和对应的步进电机信号输入端连接起来团好
3、速度不可以调节的过快,不然就没有力矩转动了
4、按s4(设置成独立按键模式)可以控制正反转
------------------------------------------------*/
#include <reg52.h>
bit Flag//定义正反转标志位
unsigned char code F_Rotation[4]={0xf1,0xf2,0xf4,0xf8}//正转表格
unsigned char code B_Rotation[4]={0xf8,0xf4,0xf2,0xf1}/羡笑/反转表格
/******************************************************************/
/*延时函数*/
/******************************************************************/
void Delay(unsigned int i)//延时
{
while(--i)
}
/******************************************************************/
/* 主函数 */
/******************************************************************/
main()
{
unsigned char i
EX1=1//外部中断0开
IT1=1//边沿触发
EA=1 //全局中断开
while(!Flag)
{
P0=0x71//显示 F 标示正转
for(i=0i<4i++) //4相
{
P1=F_Rotation[i] //输出对应的相 可以自行换成反转表格
Delay(500) //改变这个参数可以调整电机转速 ,数字越小,转速越大
}
}
while(Flag)
{
P0=0x7C//显示 b 标示反转
for(i=0i<4i++) //4相
{
P1=B_Rotation[i] //输出对应的相
Delay(500) //改变这个参数可以调整电机转速 ,数字越小,转速越大
}
}
}
/******************************************************************/
/* 中断入口函数 */
/******************************************************************/
void ISR_Key(void) interrupt 2 using 1
{
Delay(300)
Flag=!Flag//s3按下触发一次,标志位取反
}
我给你一段作为参册磨考,最近正在研究这个玩意。让步进电机转动很简单,最简颤或单的方式就是依次给它的每一项一个脉冲(脉冲时间适具体情况而定)。首先这个程序是针对4项步进电机的,采用单4拍转动的方式。步进电机还有其他参数,比如转速等等,都要考虑在内。步进电机子程序放在定时器中断里面。不是特别精确。能用州洞斗。里面设立了几个标志,你应该能看懂void StepMotor(void) //步进电机子函数
{
//正转//
if (MOTORCONTROL==2)
{
if(motortime<3) //转的圈数。
{
motorABCD++
switch( motorABCD ) //精度要求不高,改8拍为4拍转动方式
{
case 2MS:
m1=0
m2=1
m3=1
m4=1
break
case 3MS:
m1=1
m2=0
m3=1
m4=1
break
case 4MS:
m1=1
m2=1
m3=0
m4=1
break
case 5MS:
m1=1
m2=1
m3=1
m4=0
motortime++
motorABCD=1MS
break
}
}
}
//反转//
if (MOTORCONTROL==1)
{
if(motortime<3) //转的圈数。
{
motorABCD++
switch( motorABCD ) //精度要求不高,改8拍为4拍转动方式
{
case 2MS:
m1=0
m2=1
m3=1
m4=1
break
case 3MS:
m1=1
m2=1
m3=1
m4=0
break
case 4MS:
m1=1
m2=1
m3=0
m4=1
break
case 5MS:
m1=1
m2=0
m3=1
m4=1
motortime++
motorABCD=1MS
break
}
}
}
if(motortime==3)
{
motortime=0
MOTORCONTROL=0
}
}//子函数结尾
void MOTOR() interrupt 3//定时器1 中断程序
{
TH1=(65536-990)/256 /*恢复计数初值*/
TL1=(65536-990)%256
StepMotor()
}
第一,你什么电机?第二,步进电机你是几线几向的?你这都没说清楚让人档键咋写?其实思想很简单,比如你是用PWM写的,就是控制脉冲占空比。
思想都说了,你要代码?
给搭尺你个例子你行枝巧看看就行了,估计直接用是不可能的,接口不同。
// 左轮驱动
void __leftMotorContr (void)
{
static int8 cStep = 0 /* ±£Žæµç»úµ±Ç°Î»ÖÃ*/
switch (__GmLeft.cDir) {
case __MOTORGOAHEAD:/* ÏòÇ°²œœø*/
cStep = (cStep + 1) % 8
break
case __MOTORGOBACK: /* Ïòºó²œœø*/
cStep = (cStep + 7) % 8
break
default:
break
}
switch (cStep) {
case 0: /* A2B2*/
GPIOPinWrite(GPIO_PORTD_BASE,
__PHLA1 | __PHLA2 | __PHLB1 | __PHLB2,
__PHLA1 | __PHLA2 | __PHLB1 | __PHLB2)
break
case 1: /* B2 */
GPIOPinWrite(GPIO_PORTD_BASE,
__PHLA1 | __PHLA2 | __PHLB1 | __PHLB2,
__PHLB1 | __PHLB2)
break
case 2: /* A1B2*/
GPIOPinWrite(GPIO_PORTD_BASE,
__PHLA1 | __PHLA2 | __PHLB1 | __PHLB2,
__PHLA2 | __PHLB1 | __PHLB2)
break
case 3: /* A1 */
GPIOPinWrite(GPIO_PORTD_BASE,
__PHLA1 | __PHLA2 | __PHLB1 | __PHLB2,
__PHLA2)
break
case 4: /* A1B1*/
GPIOPinWrite(GPIO_PORTD_BASE,
__PHLA1 | __PHLA2 | __PHLB1 | __PHLB2,
__PHLA2 | __PHLB2)
break
case 5: /* B1 */
GPIOPinWrite(GPIO_PORTD_BASE,
__PHLA1 | __PHLA2 | __PHLB1 | __PHLB2,
__PHLB2)
break
case 6: /* A2B1*/
GPIOPinWrite(GPIO_PORTD_BASE,
__PHLA1 | __PHLA2 | __PHLB1 | __PHLB2,
__PHLA1 | __PHLA2 | __PHLB2)
break
case 7: /* A2 */
GPIOPinWrite(GPIO_PORTD_BASE,
__PHLA1 | __PHLA2 | __PHLB1 | __PHLB2,
__PHLA1 | __PHLA2)
break
default:
break
}
}
// 右轮驱动同理
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)