PIC步进电机原理图:
一、步进电机单双八拍正转
步进电动机是一种将电脉冲信号转换成角位移或线位移的机电元件。步进电动机的输入量是脉冲序列,输出量则为相应的增量位移或步进运动。正常运动情况下,它每转一周具有固定的步数;做连续步进运动时,其旋转转速与输入脉冲的频率保持严格的对应关系,不受电压波动和负载变化的影响。
本程序采用单双八拍工作方式:A-AB-B-BC-C-CD-D-DA (即一个脉冲,转 3.75 度)。
如要实现电机反转,只要更改脉冲方向即可。可更改为:D-CD-C-BC-B-AB-A-DA。
#include
#define uint8 unsigned char
#define uint16 unsigned int
__CONFIG(WDTDIS & LVPDIS & HS & PWRTDIS & BORDIS);//设置配置位
//WDTDIS:disable watchdog timer
//LVPDIS:low voltage programming disabled
//HS:high speed crystal/resonator
//PWRTDIS:disable power up timer
//BORDIS:disable brown out reset
#define F1 RB5
#define F2 RB4
#define F3 RB3
#define F4 RB2
/***************************定义全局变量***************************************/
#define Speed 2 //速度,可以调节
volatile uint8 MotorStep = 0,count =0,coun =0 ;
volatile uint8 time_flag = 0;
/***************************函数声明***************************************/
void SetMotor(void);
void InitMotor(void);
/*******************************************************************************
* 函 数 名: InitMotor(void
* 函数功能: 马达初始化
* 入口参数: 无
* 返 回: 无
*******************************************************************************/
void InitMotor(void)
{
F1 = 1;
F2 = 1;
F3 = 1;
F4 = 1;
}
/*******************************************************************************
* 函 数 名: SetMotor(void)
* 函数功能: 马达八拍运行
* 入口参数: 无
* 返 回: 无
*******************************************************************************/
void SetMotor(void)
{
switch(MotorStep)
{
case 0: // A
if(time_flag)
{
F1 = 0;
F2 = 1;
F3 = 1;
F4 = 1;
MotorStep = 1;
time_flag = 0;
}
break;
case 1: // AB
if(time_flag ==1)
{
F1 = 0;
F2 = 0;
F3 = 1;
F4 = 1;
MotorStep = 2;
time_flag = 0;
}
break;
case 2: //B
if(time_flag ==1)
{
F1 = 1;
F2 = 0;
F3 = 1;
F4 = 1;
MotorStep = 3;
time_flag = 0;
}
break;
case 3: //BC
if(time_flag ==1)
{
F1 = 1;
F2 = 0;
F3 = 0;
F4 = 1;
MotorStep = 4;
time_flag = 0;
}
break;
case 4: //C
if(time_flag ==1)
{
F1 = 1;
F2 = 1;
F3 = 0;
F4 = 1;
MotorStep = 5;
time_flag = 0;
}
break;
case 5: //CD
if(time_flag ==1)
{
F1 = 1;
F2 = 1;
F3 = 0;
F4 = 0;
MotorStep = 6;
time_flag = 0;
}
break;
case 6: //D
if(time_flag ==1)
{
F1 = 1;
F2 = 1;
F3 = 1;
F4 = 0;
MotorStep = 7;
time_flag = 0;
}
break;
case 7: //DA
if(time_flag ==1)
{
F1 = 0;
F2 = 1;
F3 = 1;
F4 = 0;
MotorStep = 0;
time_flag = 0;
coun++;
if(coun>= 64)
{
coun = 0;
}
}
break;
default:break;
}
}
/******************************************************************************
* 函 数 名: main()
* 函数功能: 单双八拍
* 入口参数: 无
* 返 回: 无
*******************************************************************************/
void main()
{
TRISB = 0x00;
T1CON = 0x08;
TMR1H = (65535-5*500)/256; //65535-500*5 0.5毫秒延时
TMR1L = (65535-5*500)%256;
TMR1IE = 1;
TMR1IF = 0;
PEIE = 1;
GIE = 1;
TMR1ON = 1;
InitMotor();
while(1)
{
SetMotor();
}
}
/******************************************************************************
* 函 数 名: interrupt Capture(void)
* 函数功能: 中断函数
* 入口参数: 无
* 返 回: 无
*******************************************************************************/
void interrupt ISR(void)
{
if(TMR1IF == 1)
{
TMR1ON = 0;
TMR1IE = 0;
TMR1IF = 0;
count++;
if(count >= Speed)
{
time_flag = 1;
count = 0;
}
TMR1H = (65535-5*500)/256;
TMR1L = (65535-5*500)%256;
TMR1IE = 1;
TMR1ON = 1;
}
}
二、实现步进电机的反转
#include
#define uint8 unsigned char
#define uint16 unsigned int
__CONFIG(FOSC_HS &WDTE_OFF &BOREN_OFF &PWRTE_OFF &LVP_OFF); //设置配置位
//WDTE_OFF:disable watchdog timer 看门狗禁止
//LVP_OFF:low voltage programming disabled 低电压编程禁止
//FOSC_HS:high speed crystal/resonator 4M以上晶振选择HS高速
//PWRTDIS:disable power up timer
//BOREN_OFF:disable brown out reset
#define F1 RB2
#define F2 RB3
#define F3 RB4
#define F4 RB5
/***************************定义全局变量***************************************/
#define Speed 2 //速度,可以调节
volatile uint8 MotorStep = 0, count = 0 ;
volatile uint8 time_flag = 0;
/***************************函数声明***************************************/
void SetMotor(void);
void InitMotor(void);
/*******************************************************************************
* 函 数 名: InitMotor(void
* 函数功能: 马达初始化
* 入口参数: 无
* 返 回: 无
*******************************************************************************/
void InitMotor(void)
{
F1 = 1;
F2 = 1;
F3 = 1;
F4 = 1;
}
/*******************************************************************************
* 函 数 名: SetMotor(void)
* 函数功能: 马达八拍运行
* 入口参数: 无
* 返 回: 无
*******************************************************************************/
void SetMotor(void)
{
switch(MotorStep)
{
case 0: // D
if(time_flag)
{
F1 = 0;
F2 = 1;
F3 = 1;
F4 = 1;
MotorStep = 1;
time_flag = 0;
}
break;
case 1: // CD
if(time_flag == 1)
{
F1 = 0;
F2 = 0;
F3 = 1;
F4 = 1;
MotorStep = 2;
time_flag = 0;
}
break;
case 2: //CC
if(time_flag == 1)
{
F1 = 1;
F2 = 0;
F3 = 1;
F4 = 1;
MotorStep = 3;
time_flag = 0;
}
break;
case 3: // BC
if(time_flag == 1)
{
F1 = 1;
F2 = 0;
F3 = 0;
F4 = 1;
MotorStep = 4;
time_flag = 0;
}
break;
case 4: // B
if(time_flag == 1)
{
F1 = 1;
F2 = 1;
F3 = 0;
F4 = 1;
MotorStep = 5;
time_flag = 0;
}
break;
case 5: // AB
if(time_flag == 1)
{
F1 = 1;
F2 = 1;
F3 = 0;
F4 = 0;
MotorStep = 6;
time_flag = 0;
}
break;
case 6: // A
if(time_flag == 1)
{
F1 = 1;
F2 = 1;
F3 = 1;
F4 = 0;
MotorStep = 7;
time_flag = 0;
}
break;
case 7: // DA
if(time_flag == 1)
{
F1 = 0;
F2 = 1;
F3 = 1;
F4 = 0;
MotorStep = 0;
time_flag = 0;
}
break;
default:
break;
}
}
/******************************************************************************
* 函 数 名: main()
* 函数功能: 单双八拍
* 入口参数: 无
* 返 回: 无
*******************************************************************************/
void main()
{
TRISB = 0x00;
T1CON = 0x08;
TMR1H = (65535 - 5 * 500) / 256; //65535-500*5 0.5毫秒延时
TMR1L = (65535 - 5 * 500) % 256;
TMR1IE = 1;
TMR1IF = 0;
PEIE = 1;
GIE = 1;
TMR1ON = 1;
InitMotor();
while(1)
{
SetMotor();
}
}
/******************************************************************************
* 函 数 名: interrupt Capture(void)
* 函数功能: 中断函数
* 入口参数: 无
* 返 回: 无
*******************************************************************************/
void interrupt ISR(void)
{
if(TMR1IF == 1)
{
TMR1ON = 0;
TMR1IE = 0;
TMR1IF = 0;
count++;
if(count >= Speed)
{
time_flag = 1;
count = 0;
}
TMR1H = (65535 - 5 * 500) / 256;
TMR1L = (65535 - 5 * 500) % 256;
TMR1IE = 1;
TMR1ON = 1;
}
}