PIC单片机-步进电机的正转与反转
来源:互联网 发布:js设置button文字 编辑:程序博客网 时间:2024/04/27 16:44
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
- PIC单片机-步进电机的正转与反转
- 步进电机正反转
- 控制步进电机正反转的实际应用程序
- 单片机控制电机正反转
- 步进电机的单片机控制
- Arduino单片机控制三相电机正反转
- 28BYJ-48步进电机连续正反转 的控制 [李园7舍_404]
- 51单片机控制步进电机的程序
- 单片机对步进电机的控制(一)
- 单片机对步进电机的控制(二)
- 步进电机与伺服电机的区别
- 【转】步进电机的基本原理
- 用单片机控制步进电机
- DDA输出脉冲序列控制步进电机正反转(加速、减速、匀速)
- 步进电机与伺服电机
- 步进电机与伺服电机的区别与联系
- mega128单片机控制光驱上的步进电机
- 单片机连接ULN2003驱动步进电机的应用
- 20个优秀的前端框架
- Java 设计模式
- Linux环境下BufferedImage Graphics drawString 中文乱码解决方法
- 基于NodeJS的14款Web框架
- 分布式服务框架学习笔记 01
- PIC单片机-步进电机的正转与反转
- The project was not built since its build path is incomplete. Cannot find the class file for javax.s
- 两会记者新设备引关注 记者变身“钢铁侠”
- 全局函数
- request.getParameter() 和request.getAttribute() 区别
- 2. Add Two Numbers
- 【2017年新篇章】 .NET 面试题汇总(二)
- 私人定制,十款最佳Node.js MVC框架
- 数据结构(C++实现)——变长顺序表的实现