步进电机控制实践
活到老学到老,这几天对步进电机控制进行实践操作,包括硬件与软件。住要目的实践体验步进电机转动性能,转速控制。特别低转速。软件编程。
零:硬件连接:
一:步进电机控制原理:
步进电机工作原理的间单介绍。两相步进电机总共两个挠组,电机有四条线连接到驱动
器,将两个挠组在同一时刻通上相反方向的脉冲电流,步进电机向前走一步。 我手头上的电机参数,最小步距为1.8度。最高电压24V,最大电流1.5A. 这里我们只需知道步进电机控制原理与方法,步进电机内部挠组结构,磁电原理不进行深入讨论与说明。
意思也就是说,每出一个脉冲驱动,电机可以走1.8度。走一转需要 360度/1.8度=200个脉冲。 这个是个基础数据。 也是1:1没有分步。 步进电机驱动器为了更精准的控制步进距离,还有分步。 通常粗糙控制器有 1/2步,4/1步,1/8步,1/16步, 1/32步;更精密驱动芯片,例如TI 微步步进电机驱动芯片DRV8424, DRV8425 ,分步就有1/2步,4/1步,1/8步,1/16步, 1/32步,1/64步,1/128步,1/256步。最高精度可以做到1/256步。可用打印机这些精密的设备上面。
我从拼多多上面花了45元买了一个步进电机驱动模块,型号:TB6600。 输入电压9-24V, 最小分步1,最大 1/32步。 可以通过三位拨码开关设置 1:1步,1/2步,1/4步,1/8步,1/16步,1/32步。从控制信号输入端可以用PWM脉冲信号控制步进电机的转速,扭距,用高低电平控制转动的方向。
现在我们计算一下PWM如何通过频率控制步进电机转速。
我们电机最小步距是1.8度。 驱动器分步我们选1/32步。 为了方便计算说明,把分步后的最小步距用Smin表示,
Smin=1.8/32=0.05625度。
转一圈360度需要步数用ST表示:
ST=360度/Smin=360/0.05625=6400步。
根据步进电机原理一个脉冲,走一步,如果走一圈需要6400个脉冲。假设我们需要1秒钟转一圈,那我们只需要单片机一秒钟发送6400个脉冲就可以了。为了后面单片机PWM周期设定,这里我们把周期值也计算出来,用TPWM表示:
TPWM=1/ST=1/6400=156.25us.
根据以上原理,我们要通过PWM控制步进电机前进步长,转速,我们需要知道几个参数。
第一:步进电机最小步距:
第二:驱动器的分步数。
第三;步进距离,也就是转动圈数。
总结以上内容,合并以上所有计算公式最后得出一公式。PWM的周期值。
TPWM=1/【360/(Smin/分步数)】
TPWM=1/[360/(1.8/32)]=0.00015625秒
电机转动圈数通常用1分钟转多少圈来表示。
如果把圈数转动时间换成分钟。那么先计算出一秒钟转动圈数。比如:1分钟转300圈。
那么就是300/60=5圈。所需要总脉冲数就 5X(360/(1.8/32))=32000. 然后再算TPWM=1/32000=31.25微秒。
把公式按分钟变换一下: 一分钟转动圈数用N表示。
TPWM=1/[(N/60)*360/(1.8/32)]
TPWM=1/[(300/60)*360/(1.8/32)]= 31.25微秒
根据以上步进电机控制原理。问题变的很间单,我们只要根据TPWM数据用单片PWM
功能发出需要的脉冲数量就可以了,
二:设计目标:
根据步进电机的控制原理与反法,用32位单片机ZB32L032的PWM功能输出周期31。25us的PWM波,使电机转速在300转一份钟。当正转300转后,立刻反转300转。然后再正转300转。转速显示在四位LED屏上。前面第一位数表示转动方向,用F表示正转,R表示反转,后面三位数表示转速。
用32位单片机ZB32L032的31脚PA10口输出PWM波。
30脚PA09输出正反转控制信号,高电平控制正转,低电平控制反转。
29脚PA08输出使能信号,高电平打开驱动器,低电平关闭驱动器并进入低功耗待机状态。
PWM波使用ZB32L032的高级定时器1,使能PWM功能,从31脚PA10口输出PWM波,开启中断功能,在中断函数里面进行计数。计算器到达6400次,表示步进电机转了一圈。192000次表示300圈,此时从单片机30脚PA09输出低电平,控制电机反转,当反转300圈后,再从单片机30脚PA09输出高电平,使步进电机正转。
使用单片机ZB32L032的基本定时器11,定时1ms用于对LED屏显示屏进行动态扫描。扫描每位LED屏约1ms,4位LED屏约需要4ms, 扫描整整屏约250HZ.
三:软件流程:
四:部分主要代码:
int main(void){
// uint32_t PrescalerValue = 0;
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* Configure the system clock to HIRC 24MHz*/
_SystemClock_Config();
/**
* Enable GPIO clock for configuring.
*/
gpio_init();
// PrescalerValue = (uint32_t)(HAL_RCC_GetPCLKFreq() / CONFIG_TIMx_FREQ);//0.00015625
pwm_init();
timer11_init();
P_pww->pwm_counter=0;
step_motor_direction(RIGHT_DIR_MOTOR);
while(1){
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,GPIO_PIN_RESET);
if(P_pww->pwm_counter<1920000){
step_motor_direction(RIGHT_DIR_MOTOR);
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_6);
HAL_Delay(50);
}
else if((P_pww->pwm_counter>1920000)&&(P_pww->pwm_counter<3840000)){
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_6);
step_motor_direction(LEFT_DIR_MOTOR);
HAL_Delay(200);
}
else{
P_pww->pwm_counter=0;
}
key_working();
led_displayer_run();
}
}
void Error_Handler(void){
while(1){
}
}
#include "pwm.h"
TIM_HandleTypeDef g_hTIMx = {0};
void pwm_init(void){
// TIM_HandleTypeDef g_hTIMx = {0};
TIM_OC_InitTypeDef g_hTIMxOC = {0};
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_TIM1_CLK_ENABLE();
GPIO_InitStruct.Pin =GPIO_PIN_10;
GPIO_InitStruct.Mode =GPIO_MODE_AF;
GPIO_InitStruct.Debounce.Enable = GPIO_DEBOUNCE_ENABLE;
GPIO_InitStruct.SlewRate = GPIO_SLEW_RATE_HIGH;
GPIO_InitStruct.DrvStrength = GPIO_DRV_STRENGTH_HIGH;
GPIO_InitStruct.Pull = GPIO_PUSHPULL;
GPIO_InitStruct.Alternate=GPIO_AF_MODE_2;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
g_hTIMx.Instance = TIM1;
g_hTIMx.Init.Period =31;//52;//78;//9433;//1561; //156-1; // TIM1A_ARR Period
g_hTIMx.Init.Prescaler = 64; // TIMx Frequency(CK_CNT) = fCK_PSC/(PSC[15:0]+1) = TIMx_FREQ
g_hTIMx.Init.ClockDivision = 0; // CKD(Clock division)
g_hTIMx.Init.CounterMode = TIM_COUNTERMODE_UP; // Edge alignment mode ,counter up
g_hTIMx.Init.RepetitionCounter = 0; // TIM1A_RCR
g_hTIMx.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; // Enable Auto-reload
HAL_TIM_PWM_Init(&g_hTIMx);
g_hTIMxOC.OCMode =TIM_OCMODE_PWM1;// TIM_OCMODE_PWM1; // PWM mode1 TIM1A_CCMR1
g_hTIMxOC.Pulse =10;//5500; // This value is used to determine the duty cycle,and the default duty cycle is 50%
g_hTIMxOC.OCPolarity = TIM_OCPOLARITY_LOW; // Output polarity, OC1 is valid at low level
// HAL_TIM_PWM_ConfigChannel(&g_hTIMx, &g_hTIMxOC, TIM_CHANNEL_1); // Configure TIM1A Channel1
HAL_TIM_PWM_ConfigChannel(&g_hTIMx, &g_hTIMxOC, TIM_CHANNEL_2); // Configure TIM1A Channel2
// HAL_TIM_PWM_ConfigChannel(&g_hTIMx, &g_hTIMxOC, TIM_CHANNEL_3); // Configure TIM1A Channel3
// HAL_TIM_PWM_ConfigChannel(&g_hTIMx, &g_hTIMxOC, TIM_CHANNEL_4); // Configure TIM1A Channel4
HAL_NVIC_SetPriority(TIM1_IRQn,0);
HAL_NVIC_EnableIRQ(TIM1_IRQn);
HAL_TIM_PWM_Start_IT(&g_hTIMx,TIM_CHANNEL_2);
// HAL_TIM_PWM_Start(&g_hTIMx, TIM_CHANNEL_1); //Open PWM Channel1
// HAL_TIM_PWM_Start(&g_hTIMx, TIM_CHANNEL_2); //Open PWM Channel2
// HAL_TIM_PWM_Start(&g_hTIMx, TIM_CHANNEL_3); //Open PWM Channel3
// HAL_TIM_PWM_Start(&g_hTIMx, TIM_CHANNEL_4); //Open PWM Channel4
// return;
}
五:错误点:
1:步进电机接线错误,原因是步进电机标签标示错误,按照标签颜色接入驱动器,MCU
开PWM波,电机步转,只有电流声,滴滴答答的噪声。之后用万用表确认。线路接错。正确的是红黑一挠组,蓝绿为一挠组。按正确重新接入驱动器,电机能正常运行。
2:软件启动死机,经调试时发现只要进系统时钟初始函数就卡死。后发现库文件少了“zb32l03x_it.c”. 这个文件比较隐蔽,建工程项目时没有加进来。
六:更新内容:
昨天下午把4位LED屏得软件写完了。然后把转数显示在LED屏上。 今天早上把把计算速度算法也写好,这个算法是自动计算PWM得周期,电机转速..只需要输入每分钟的转速就可以电机转起来。利用这个算法测试了1:1, 1/2,1/4, 1/8,1/16, 1/32得细分步长,测试结果,步进电机在不同思分下,基本在每秒钟3-9圈之间。 太低转速或者太高转速,出现效率低,噪声大,或者只有电流声,抖动声,转不起来。最佳转速在一分钟300-500转。电流最小,噪声最小,效率是最高。可能也跟我买得这个电机也有关系。 以下是算法与测试参数结果: 测试结果就是后面注释。
void motor_base_data(float number_circle){
float circle_each_second;
float circle_pulse;
float step_number;
float setup_number_circle;
// step_number=200;//3-6.6 circle each second 300-400
// step_number=400; //5-6.6 circle each second 400-450
// step_number=800; //6.6-9.1 circle each second 400-550
// step_number=1600; //6.6-8.3 circle each second 400-500
// step_number=3200; //6.6-9.1 circle each second 400-550
step_number=6400; //5-8.3 circle each second 400-550
setup_number_circle=number_circle;
circle_each_second=setup_number_circle/60;
circle_pulse=circle_each_second*step_number;
P_pww->pwm_Period=(uint16_t) (1000000/circle_pulse);
P_pww->pwm_duty=P_pww->pwm_Period/2;
motor_P->motor_circle_plues=(uint16_t) (circle_pulse);
}
4位LED屏显是代码如下:
#include "led_displayer.h"
void dp_display(unsigned char on_off){
if(on_off){
HAL_GPIO_WritePin(SEG_DP_PORT,SEG_DP_GPIO,GPIO_PIN_SET);
}
else{
HAL_GPIO_WritePin(SEG_DP_PORT,SEG_DP_GPIO,GPIO_PIN_RESET);
}
}
void numbers_0_9(unsigned char number){
unsigned char displayer_data;
displayer_data=number;
switch(displayer_data){
case ALL_TRUN_ON:{
HAL_GPIO_WritePin(SEG_A_PORT,SEG_A_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(SEG_B_PORT,SEG_B_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(SEG_C_PORT,SEG_C_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(SEG_D_PORT,SEG_D_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(SEG_E_PORT,SEG_E_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(SEG_F_PORT,SEG_F_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(SEG_G_PORT,SEG_G_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(SEG_DP_PORT,SEG_DP_GPIO,GPIO_PIN_SET);
break;
}
case ALL_TRUN_OFF:{
HAL_GPIO_WritePin(SEG_A_PORT,SEG_A_GPIO,GPIO_PIN_RESET);
HAL_GPIO_WritePin(SEG_B_PORT,SEG_B_GPIO,GPIO_PIN_RESET);
HAL_GPIO_WritePin(SEG_C_PORT,SEG_C_GPIO,GPIO_PIN_RESET);
HAL_GPIO_WritePin(SEG_D_PORT,SEG_D_GPIO,GPIO_PIN_RESET);
HAL_GPIO_WritePin(SEG_E_PORT,SEG_E_GPIO,GPIO_PIN_RESET);
HAL_GPIO_WritePin(SEG_F_PORT,SEG_F_GPIO,GPIO_PIN_RESET);
HAL_GPIO_WritePin(SEG_G_PORT,SEG_G_GPIO,GPIO_PIN_RESET);
HAL_GPIO_WritePin(SEG_DP_PORT,SEG_DP_GPIO,GPIO_PIN_RESET);
break;
}
case CHARACTER_F:{
HAL_GPIO_WritePin(SEG_A_PORT,SEG_A_GPIO,GPIO_PIN_SET);
// HAL_GPIO_WritePin(SEG_B_PORT,SEG_B_GPIO,GPIO_PIN_RESET);
// HAL_GPIO_WritePin(SEG_C_PORT,SEG_C_GPIO,GPIO_PIN_RESET);
// HAL_GPIO_WritePin(SEG_D_PORT,SEG_D_GPIO,GPIO_PIN_RESET);
HAL_GPIO_WritePin(SEG_E_PORT,SEG_E_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(SEG_F_PORT,SEG_F_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(SEG_G_PORT,SEG_G_GPIO,GPIO_PIN_SET);
// HAL_GPIO_WritePin(SEG_DP_PORT,SEG_DP_GPIO,GPIO_PIN_SET);
break;
}
case CHARACTER_R:{
HAL_GPIO_WritePin(SEG_A_PORT,SEG_A_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(SEG_B_PORT,SEG_B_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(SEG_C_PORT,SEG_C_GPIO,GPIO_PIN_SET);
// HAL_GPIO_WritePin(SEG_D_PORT,SEG_D_GPIO,GPIO_PIN_RESET);
HAL_GPIO_WritePin(SEG_E_PORT,SEG_E_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(SEG_F_PORT,SEG_F_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(SEG_G_PORT,SEG_G_GPIO,GPIO_PIN_SET);
// HAL_GPIO_WritePin(SEG_DP_PORT,SEG_DP_GPIO,GPIO_PIN_SET);
break;
}
case NO_DISPLAY:{
HAL_GPIO_WritePin(SEG_A_PORT,SEG_A_GPIO,GPIO_PIN_RESET);
HAL_GPIO_WritePin(SEG_B_PORT,SEG_B_GPIO,GPIO_PIN_RESET);
HAL_GPIO_WritePin(SEG_C_PORT,SEG_C_GPIO,GPIO_PIN_RESET);
HAL_GPIO_WritePin(SEG_D_PORT,SEG_D_GPIO,GPIO_PIN_RESET);
HAL_GPIO_WritePin(SEG_E_PORT,SEG_E_GPIO,GPIO_PIN_RESET);
HAL_GPIO_WritePin(SEG_F_PORT,SEG_F_GPIO,GPIO_PIN_RESET);
HAL_GPIO_WritePin(SEG_G_PORT,SEG_G_GPIO,GPIO_PIN_RESET);
break;
}
case NUMBER_0:{
HAL_GPIO_WritePin(SEG_A_PORT,SEG_A_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(SEG_B_PORT,SEG_B_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(SEG_C_PORT,SEG_C_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(SEG_D_PORT,SEG_D_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(SEG_E_PORT,SEG_E_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(SEG_F_PORT,SEG_F_GPIO,GPIO_PIN_SET);
// HAL_GPIO_WritePin(SEG_G_PORT,SEG_G_GPIO,GPIO_PIN_RESET);
// HAL_GPIO_WritePin(SEG_DP_PORT,SEG_DP_GPIO,GPIO_PIN_RESET);
break;
}
case NUMBER_1:{
// HAL_GPIO_WritePin(SEG_A_PORT,SEG_A_GPIO,GPIO_PIN_RESET);
HAL_GPIO_WritePin(SEG_B_PORT,SEG_B_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(SEG_C_PORT,SEG_C_GPIO,GPIO_PIN_SET);
// HAL_GPIO_WritePin(SEG_D_PORT,SEG_D_GPIO,GPIO_PIN_RESET);
// HAL_GPIO_WritePin(SEG_E_PORT,SEG_E_GPIO,GPIO_PIN_RESET);
// HAL_GPIO_WritePin(SEG_F_PORT,SEG_F_GPIO,GPIO_PIN_RESET);
// HAL_GPIO_WritePin(SEG_G_PORT,SEG_G_GPIO,GPIO_PIN_RESET);
// HAL_GPIO_WritePin(SEG_DP_PORT,SEG_DP_GPIO,GPIO_PIN_RESET);
break;
}
case NUMBER_2:{
HAL_GPIO_WritePin(SEG_A_PORT,SEG_A_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(SEG_B_PORT,SEG_B_GPIO,GPIO_PIN_SET);
// HAL_GPIO_WritePin(SEG_C_PORT,SEG_C_GPIO,GPIO_PIN_RESET);
HAL_GPIO_WritePin(SEG_D_PORT,SEG_D_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(SEG_E_PORT,SEG_E_GPIO,GPIO_PIN_SET);
// HAL_GPIO_WritePin(SEG_F_PORT,SEG_F_GPIO,GPIO_PIN_RESET);
HAL_GPIO_WritePin(SEG_G_PORT,SEG_G_GPIO,GPIO_PIN_SET);
// HAL_GPIO_WritePin(SEG_DP_PORT,SEG_DP_GPIO,GPIO_PIN_RESET);
break;
}
case NUMBER_3:{
HAL_GPIO_WritePin(SEG_A_PORT,SEG_A_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(SEG_B_PORT,SEG_B_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(SEG_C_PORT,SEG_C_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(SEG_D_PORT,SEG_D_GPIO,GPIO_PIN_SET);
// HAL_GPIO_WritePin(SEG_E_PORT,SEG_E_GPIO,GPIO_PIN_RESET);
// HAL_GPIO_WritePin(SEG_F_PORT,SEG_F_GPIO,GPIO_PIN_RESET);
HAL_GPIO_WritePin(SEG_G_PORT,SEG_G_GPIO,GPIO_PIN_SET);
// HAL_GPIO_WritePin(SEG_DP_PORT,SEG_DP_GPIO,GPIO_PIN_RESET);
break;
}
case NUMBER_4:{
// HAL_GPIO_WritePin(SEG_A_PORT,SEG_A_GPIO,GPIO_PIN_RESET);
HAL_GPIO_WritePin(SEG_B_PORT,SEG_B_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(SEG_C_PORT,SEG_C_GPIO,GPIO_PIN_SET);
// HAL_GPIO_WritePin(SEG_D_PORT,SEG_D_GPIO,GPIO_PIN_RESET);
// HAL_GPIO_WritePin(SEG_E_PORT,SEG_E_GPIO,GPIO_PIN_RESET);
HAL_GPIO_WritePin(SEG_F_PORT,SEG_F_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(SEG_G_PORT,SEG_G_GPIO,GPIO_PIN_SET);
// HAL_GPIO_WritePin(SEG_DP_PORT,SEG_DP_GPIO,GPIO_PIN_RESET);
break;
}
case NUMBER_5:{
HAL_GPIO_WritePin(SEG_A_PORT,SEG_A_GPIO,GPIO_PIN_SET);
// HAL_GPIO_WritePin(SEG_B_PORT,SEG_B_GPIO,GPIO_PIN_RESET);
HAL_GPIO_WritePin(SEG_C_PORT,SEG_C_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(SEG_D_PORT,SEG_D_GPIO,GPIO_PIN_SET);
// HAL_GPIO_WritePin(SEG_E_PORT,SEG_E_GPIO,GPIO_PIN_RESET);
HAL_GPIO_WritePin(SEG_F_PORT,SEG_F_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(SEG_G_PORT,SEG_G_GPIO,GPIO_PIN_SET);
// HAL_GPIO_WritePin(SEG_DP_PORT,SEG_DP_GPIO,GPIO_PIN_RESET);
break;
}
case NUMBER_6:{
HAL_GPIO_WritePin(SEG_A_PORT,SEG_A_GPIO,GPIO_PIN_SET);
// HAL_GPIO_WritePin(SEG_B_PORT,SEG_B_GPIO,GPIO_PIN_RESET);
HAL_GPIO_WritePin(SEG_C_PORT,SEG_C_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(SEG_D_PORT,SEG_D_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(SEG_E_PORT,SEG_E_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(SEG_F_PORT,SEG_F_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(SEG_G_PORT,SEG_G_GPIO,GPIO_PIN_SET);
// HAL_GPIO_WritePin(SEG_DP_PORT,SEG_DP_GPIO,GPIO_PIN_RESET);
break;
}
case NUMBER_7:{
HAL_GPIO_WritePin(SEG_A_PORT,SEG_A_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(SEG_B_PORT,SEG_B_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(SEG_C_PORT,SEG_C_GPIO,GPIO_PIN_SET);
// HAL_GPIO_WritePin(SEG_D_PORT,SEG_D_GPIO,GPIO_PIN_RESET);
// HAL_GPIO_WritePin(SEG_E_PORT,SEG_E_GPIO,GPIO_PIN_RESET);
// HAL_GPIO_WritePin(SEG_F_PORT,SEG_F_GPIO,GPIO_PIN_RESET);
// HAL_GPIO_WritePin(SEG_G_PORT,SEG_G_GPIO,GPIO_PIN_RESET);
// HAL_GPIO_WritePin(SEG_DP_PORT,SEG_DP_GPIO,GPIO_PIN_RESET);
break;
}
case NUMBER_8:{
HAL_GPIO_WritePin(SEG_A_PORT,SEG_A_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(SEG_B_PORT,SEG_B_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(SEG_C_PORT,SEG_C_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(SEG_D_PORT,SEG_D_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(SEG_E_PORT,SEG_E_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(SEG_F_PORT,SEG_F_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(SEG_G_PORT,SEG_G_GPIO,GPIO_PIN_SET);
// HAL_GPIO_WritePin(SEG_DP_PORT,SEG_DP_GPIO,GPIO_PIN_RESET);
break;
}
case NUMBER_9:{
HAL_GPIO_WritePin(SEG_A_PORT,SEG_A_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(SEG_B_PORT,SEG_B_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(SEG_C_PORT,SEG_C_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(SEG_D_PORT,SEG_D_GPIO,GPIO_PIN_SET);
// HAL_GPIO_WritePin(SEG_E_PORT,SEG_E_GPIO,GPIO_PIN_RESET);
HAL_GPIO_WritePin(SEG_F_PORT,SEG_F_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(SEG_G_PORT,SEG_G_GPIO,GPIO_PIN_SET);
// HAL_GPIO_WritePin(SEG_DP_PORT,SEG_DP_GPIO,GPIO_PIN_RESET);
break;
}
default:{
break;
}
}
dp_display(FAIL);
}
void number_dig_1(void){
HAL_GPIO_WritePin(DIG_1_PORT,DIG_1_GPIO,GPIO_PIN_RESET);
HAL_GPIO_WritePin(DIG_2_PORT,DIG_2_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(DIG_3_PORT,DIG_3_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(DIG_4_PORT,DIG_4_GPIO,GPIO_PIN_SET);
numbers_0_9(LED_P->led_display_data1);
}
void number_dig_2(void){
HAL_GPIO_WritePin(DIG_1_PORT,DIG_1_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(DIG_2_PORT,DIG_2_GPIO,GPIO_PIN_RESET);
HAL_GPIO_WritePin(DIG_3_PORT,DIG_3_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(DIG_4_PORT,DIG_4_GPIO,GPIO_PIN_SET);
numbers_0_9(LED_P->led_display_data2);
}
void number_dig_3(void){
HAL_GPIO_WritePin(DIG_1_PORT,DIG_1_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(DIG_2_PORT,DIG_2_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(DIG_3_PORT,DIG_3_GPIO,GPIO_PIN_RESET);
HAL_GPIO_WritePin(DIG_4_PORT,DIG_4_GPIO,GPIO_PIN_SET);
numbers_0_9(LED_P->led_display_data3);
}
void number_dig_4(void){
HAL_GPIO_WritePin(DIG_1_PORT,DIG_1_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(DIG_2_PORT,DIG_2_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(DIG_3_PORT,DIG_3_GPIO,GPIO_PIN_SET);
HAL_GPIO_WritePin(DIG_4_PORT,DIG_4_GPIO,GPIO_PIN_RESET);
numbers_0_9(LED_P->led_display_data4);
}
void RESET_LED_PLAN(void){
// HAL_GPIO_WritePin(DIG_1_PORT,DIG_1_GPIO,GPIO_PIN_RESET);
// HAL_GPIO_WritePin(DIG_2_PORT,DIG_2_GPIO,GPIO_PIN_RESET);
// HAL_GPIO_WritePin(DIG_3_PORT,DIG_3_GPIO,GPIO_PIN_RESET);
// HAL_GPIO_WritePin(DIG_4_PORT,DIG_4_GPIO,GPIO_PIN_RESET);
HAL_GPIO_WritePin(SEG_A_PORT,SEG_A_GPIO,GPIO_PIN_RESET);
HAL_GPIO_WritePin(SEG_B_PORT,SEG_B_GPIO,GPIO_PIN_RESET);
HAL_GPIO_WritePin(SEG_C_PORT,SEG_C_GPIO,GPIO_PIN_RESET);
HAL_GPIO_WritePin(SEG_D_PORT,SEG_D_GPIO,GPIO_PIN_RESET);
HAL_GPIO_WritePin(SEG_E_PORT,SEG_E_GPIO,GPIO_PIN_RESET);
HAL_GPIO_WritePin(SEG_F_PORT,SEG_F_GPIO,GPIO_PIN_RESET);
HAL_GPIO_WritePin(SEG_G_PORT,SEG_G_GPIO,GPIO_PIN_RESET);
HAL_GPIO_WritePin(SEG_DP_PORT,SEG_DP_GPIO,GPIO_PIN_RESET);
}
void hex_to_dec(void){
uint32_t temp;
uint32_t display_data;
display_data=LED_P->led_data_update;
LED_P->led_display_data2=display_data/100;
temp=display_data/10;
LED_P->led_display_data3=temp%10;
LED_P->led_display_data4=display_data%10;
}
void led_displayer_run(void){
if(LED_P->led_displayer_updata_flag==TRUE){
LED_P->led_displayer_updata_flag=FAIL;
LED_P->led_disp_dig++;
hex_to_dec();
if(motor_P->motor_run_directiion==MOTOR_TRUN_RIGHT){
LED_P->led_display_data1=CHARACTER_F;
}
if(motor_P->motor_run_directiion==MOTOR_TRUN_LEFT){
LED_P->led_display_data1=CHARACTER_R;
}
if(LED_P->led_display_data2==RESET){
LED_P->led_display_data2=NO_DISPLAY;
if(LED_P->led_display_data3==RESET){
LED_P->led_display_data3=NO_DISPLAY;
}
}
// if((LED_P->led_display_data2==RESET)&&(LED_P->led_display_data3==RESET)){
// LED_P->led_display_data2=NO_DISPLAY;
// LED_P->led_display_data3=NO_DISPLAY;
// }
// LED_P->led_display_data4=8;
// LED_P->led_data_updata_1s++;
// if(LED_P->led_data_updata_1s>=1000){
// LED_P->led_data_updata_1s=RESET;
// LED_P->led_data_update++;//=NUMBER_4;//ALL_TRUN_ON;
// if(LED_P->led_data_update==10){
// LED_P->led_data_update=RESET;
// }
//
// }
RESET_LED_PLAN();
switch(LED_P->led_disp_dig){
case LED_DIG_1:{
number_dig_1();
break;
}
case LED_DIG_2:{
number_dig_2();
break;
}
case LED_DIG_3:{
number_dig_3();
break;
}
case LED_DIG_4:{
number_dig_4();
LED_P->led_disp_dig=RESET;
break;
}
default:{
LED_P->led_disp_dig=RESET;
break;
}
}
}
}
之前我设计目标到这里就结束了:不过现在我改变想法。准备自己设计一块步进电机的PCB,增加串口功能。增加更多按键功能。 用户可以通过显示屏与按键或者串口设置电机转速,转动方向。细分步长,驱动最大电流等。 用户可以不用编程就能轻易把步进电机按自己需要参数转起来。 使用户更方便。
动态请看搏客视频:
六:总结:
本次实践实现了设计目标,实现了步进电机在不同的频率的控制下,实现不同转速。在不同占空比下实现了不同扭力。通过调节PWM频率步进电机从1分钟一转到 1分钟300转的运行。同时LED数码屏实时显示转速。