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

PIC单片机-步进电机的正转与反转PIC 步进电机原理图 一 步进电机单双八拍正转 步进电动机是一种将电脉冲信号转换成角位移或线位移的机电元件 步进电动机的输入量是脉冲序列 输出量则为相应的增量位移或步进运动 正常运动情况下 它每转一周具有固定的步数 做连续步进运动时 其旋转转速与输入脉冲的频率保持严格的对应关系

大家好,我是讯享网,很高兴认识大家。

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: // 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 <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;  } }
小讯
上一篇 2025-02-20 16:40
下一篇 2025-02-23 21:20

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/85546.html