1、51单片机、TB6600驱动板、42步进电机,直流电源(9~42V都可以,推荐24V)
2、实物连接图
TB6600驱动器的细分设置为6400,电流设置为1.5A(42步进电机)
本次试验采用的是共阳极的接法
图中那3个电阻R可以不接(单片机的电压为5V,不需要接,高于5V则需要接),使能信号接的是单片机的P10口,方向是P11,脉冲是P12。单片机的P00,P01,P02,P03,P04接5个开关。
程序部分代码是基于C语言用keil编写的,采用定时器实现脉冲输出。
#include备注:#include "utils.h" #define uint unsigned int sbit ENA=P1^0; sbit DIR=P1^1; sbit PWM=P1^2; sbit SPEED_UP=P0^0; sbit SPEED_DOWN=P0^1; sbit ANGLE_UP=P0^2; sbit ANGLE_DOWN=P0^3; sbit RESET=P0^4; int pause; int reset; unsigned int freq_t; //脉冲计数 unsigned int dir_t; //方向控制计数 unsigned int speed; //速度控制 unsigned int angle; //角度范围控制 //double timer_t; //定时器执行时间间隔(ms) //long crystal_oscillator_f; //晶振频率 //long n_period; //每秒产生机器周期数; //unsigned int timer_period; //定时器需要的时间周期 void system_Ini() { //timer_t = 0.12; //定时器执行时间间隔(ms) //crystal_oscillator_f = 11059200; //晶振频率11.0592MHz //n_period = crystal_oscillator_f/12; //每秒产生11059200/12 = 921600个机器周期; //timer_period = n_period*timer_t/1000; //定时器需要的时间周期 //TH0=(65536-timer_period)/256; //高8位 //TL0=(65536-timer_period)%256; //低8位 pause = 0; reset = 0; TMOD=0x01; EA=1; ET0=1; TR0=1; //置初值 TH0=(65536-80)/256; //高8位 //1,2,80 TL0=(65536-80)%256; //低8位 ENA = 1; //1有效,0停止 DIR = 0; //0逆时针,1顺时针 PWM = 1; speed = 5; angle = 3; freq_t = 0; dir_t = angle*500*speed; } void reset_para() { dir_t = angle*500*speed; } void delay(unsigned int a) //延迟函数 { unsigned int j,k; pause = 1; for(a;a>0;a--) for(j=100;j>0;j--) for(k=250;k>0;k--) freq_t=1; pause = 0; } //定时器 (大概0.06ms执行一次) //定时器在方式1工作为16位,最大值为65536 timer () interrupt 1 { //置初值 TH0=(65536-80)/256; //高8位 TL0=(65536-80)%256; //低8位 if(!pause) { freq_t++; dir_t++; } } void main() { system_Ini(); while(RESET==1); while(1) { //复位按键 if(RESET==0) { ENA = 0; delay(1); while(RESET==0); ENA = 1; reset_para(); } //速度调节按键 if(SPEED_UP==0) { pause = 1; delay(1); while(SPEED_UP==0); pause = 0; if(speed > 1) { speed--; } } if(SPEED_DOWN==0) { pause = 1; delay(1); while(SPEED_DOWN==0); pause = 0; if(speed < 15) { speed++; } } //角度范围调节按键 if(ANGLE_UP==0) { pause = 1; delay(1); while(ANGLE_UP==0); pause = 0; if(angle < 15) { angle++; } } if(ANGLE_DOWN==0) { pause = 1; delay(1); while(ANGLE_DOWN==0); pause = 0; if(angle > 1) { angle--; } } //方向变换 if(dir_t >= angle*1000*speed) { //delay(1); dir_t = 0; DIR = ~DIR; } //脉冲输出 //PWM = ~PWM; if(freq_t >= speed*1) { freq_t = 0; PWM = ~PWM; } } }
视频讲解:基于51单片机+TB6600驱动板+42步进电机实现角度可调速度可调周期运动_哔哩哔哩_bilibili



