PIC单片机-步进电机的正转与反转

来源:互联网 发布:js设置button文字 编辑:程序博客网 时间:2024/04/27 16:44

PIC步进电机原理图:PIC单片机步进电机原理图

一、步进电机单双八拍正转

步进电动机是一种将电脉冲信号转换成角位移或线位移的机电元件。步进电动机的输入量是脉冲序列,输出量则为相应的增量位移或步进运动。正常运动情况下,它每转一周具有固定的步数;做连续步进运动时,其旋转转速与输入脉冲的频率保持严格的对应关系,不受电压波动和负载变化的影响。

本程序采用单双八拍工作方式:A-AB-B-BC-C-CD-D-DA (即一个脉冲,转 3.75 度)。

如要实现电机反转,只要更改脉冲方向即可。可更改为:D-CD-C-BC-B-AB-A-DA。

#include <htc.h>#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:   // Aif(time_flag){            F1 = 0;                F2 = 1;F3 = 1;            F4 = 1;            MotorStep = 1;time_flag = 0;}       break;       case 1: // ABif(time_flag ==1){            F1 = 0;                F2 = 0;F3 = 1;            F4 = 1;            MotorStep = 2;time_flag = 0;}       break;       case 2:   //Bif(time_flag ==1){            F1 = 1;             F2 = 0;F3 = 1;            F4 = 1;            MotorStep = 3;time_flag = 0;}break;       case 3://BCif(time_flag ==1){            F1 = 1;             F2 = 0;F3 = 0;            F4 = 1;            MotorStep = 4;time_flag = 0;}       break;     case 4: //Cif(time_flag ==1){            F1 = 1;             F2 = 1;F3 = 0;            F4 = 1;            MotorStep = 5;time_flag = 0;}       break;case 5:  //CDif(time_flag ==1){            F1 = 1;             F2 = 1;F3 = 0;            F4 = 0;            MotorStep = 6;time_flag = 0;}break;case 6:  //Dif(time_flag ==1){            F1 = 1;             F2 = 1;F3 = 1;            F4 = 0;            MotorStep = 7;time_flag = 0;}      break;case 7://DAif(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 <htc.h>#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;    }}
0 0
原创粉丝点击