完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
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; } } |
|
|
|
只有小组成员才能发言,加入小组>>
2439 浏览 0 评论
9119 浏览 4 评论
36802 浏览 19 评论
5031 浏览 0 评论
24780 浏览 34 评论
1540浏览 2评论
1760浏览 1评论
2207浏览 1评论
1565浏览 0评论
536浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 21:46 , Processed in 1.488554 second(s), Total 77, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号