stm32中的步进电机驱动和lcd显示问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了stm32中的步进电机驱动和lcd显示问题相关的知识,希望对你有一定的参考价值。

最近要做个按键控制步进电机,然后把值用lcd屏显示的stm32程序、本来想简单的改改代码,兼容各方大佬的代码就过去了,结果在while(1)上碰壁了,lcd显示程序在while循环里面显示和刷新数据,但是电机也在这个循环里面工作,里面会有延时,和lcd屏幕的延时放在了同一个循环里面,最后出来的电机几乎是停滞状态,本来电机转速就慢(100prm),加上lcd叠加的延时,电机动不了了,有没有大佬救救小白😂

参考技术A 用定时器1产生脉冲给步进电机驱动器驱动步进电机转用,然后用滴嗒定时器中断,过100MS或若干MS更新LCD显示数值。篇幅有限,只粘贴部份代码,芯片是stm32 F103ZEt6

int main(void)

/* 复位所有外设,初始化Flash接口和系统滴答定时器 */
HAL_Init();
/* 配置系统时钟 */
SystemClock_Config();
BSP_LCD_Init();

KEY_GPIO_Init();

STEPMOTOR_TIMx_Init();

LCD_Clear(0,0,LCD_DEFAULT_WIDTH,LCD_DEFAULT_HEIGTH,BLACK);

/* 开背光 */
LCD_BK_ON();

/* 无限循环 */
while (1)

if(KEY1_StateRead()==KEY_DOWN)
STEPMOTOR_AxisMoveRel(6400*-5, 500 , 500 , 4000);
if(KEY2_StateRead()==KEY_DOWN)
STEPMOTOR_AxisMoveRel(6400*5, 500 , 500 , 4000);


void HAL_SYSTICK_Callback(void)

time_count++; // 每1ms自动增一
if(time_count==100) // 0.5s

uint8_t str[50];
sprintf((char *)str,"%d",srd.step_delay);//显示定时器计数值
LCD_Clear(120,300,200,24,BLACK);
LCD_DispString_EN(120,300,(char *)str,BLACK,RED,USE_FONT_24);

sprintf((char *)str,"%d",step_position/6400); //显示总共多少圈
LCD_Clear(120,400,200,24,BLACK);
LCD_DispString_EN(120,400,(char *)str,BLACK,RED,USE_FONT_24);

time_count=0;

if(MotionStatus==STOP)

LCD_Clear(120,430,200,24,BLACK);
LCD_DispString_EN(120,430,"motro is stop",BLACK,RED,USE_FONT_24);
sprintf((char *)str,"%d",srd.decel_val/6400); //显示减速有多少圈
LCD_Clear(120,430+24,200,24,BLACK);
LCD_DispString_EN(120,430+24,(char *)str,BLACK,RED,USE_FONT_24);



else

LCD_Clear(120,430,200,24,BLACK);
LCD_DispString_EN(120,430,"motro is running",BLACK,RED,USE_FONT_24);
sprintf((char *)str,"%d",0);
LCD_Clear(120,430+24,200,24,BLACK);
LCD_DispString_EN(120,430+24,(char *)str,BLACK,RED,USE_FONT_24);


参考技术B while(1)
d=key(); //读键盘值,得到增量值
motor(d); //去驱动电机
display(d); //去刷新显示
。。。。。

在时间分配上,控制电机的键盘值的有效读取,则需要在电机完成上一次动作之后,才能读取判断。而motor(),display(),及其他函数需要同时运行的话,就需要通过中断方式来分配运行时间片。
按你目前的学习情况,还不需要考虑时间分配问题,motor()的延时就在该函数体内完成面,display()的延时就在该函数体内完成面就好了;

基于STM32的智能小车--电机驱动设计

基于STM32的智能小车

第一章 基于STM32的智能小车方案设计


基于STM32的智能小车--电机驱动设计


前言

本篇主要针对某宝上制作智能小车过程中用到的电机设计进行统一阐述,为大家提供参考。


一、电机是什么?

电动机(Motors)是把电能转换成机械能的设备,它是利用通电线圈在磁场中受力转动的现象制成,分布于各个用户处,电动机按使用电源不同分为直流电动机和交流电动机,他能提供的功率范围很大,从毫瓦级到万千瓦级。电动机的使用和控制非常方便,具有自起动 、加速、制动、反转、掣住等能力。
 

二、常见电机分类

1.有刷电机

  • 有刷电机:有刷电机是内含电刷装置的将电能转换成机械能(电动机)或将机械能转换成电能(发电机)的旋转电机。区别于无刷电机,电刷装置是用来引入或引出电压和电流的。有刷电机是所有电机的基础,它具有启动快、制动及时、可在大范围内平滑地调速、控制电路相对简单等特点。
  • 有刷电机是大家最早接触的一类电机,中学时物理课堂上介绍电动机也是以它为模型来展示的。有刷电机的主要结构就是定子+转子+电刷,通过旋转磁场获得转动力矩,从而输出动能。电刷与换向器不断接触摩擦,在转动中起到导电和换相作用。

2.无刷电机

  • 无刷电机:无刷直流电机由电动机主体和驱动器组成,是一种典型的机电一体化产品。
  • 无刷电机中,换相的工作交由控制器中的控制电路(一般为霍尔传感器+控制器,更先进的技术是磁编码器)来完成。

二、有刷电机和无刷电机在调速上的差异

实际上两种电机的控制都是调压,只是由于无刷直流采用了电子换向,所以要有数字控制才可以实现了,而有刷直流是通过碳刷换向的,利用可控硅等传统模拟电路都可以控制,比较简单。

1、有刷马达调速过程是调整马达供电电源电压的高低。调整后的电压电流通过整流子及电刷地转换,改变电极产生的磁场强弱,达到改变转速的目的。这一过程被称之为变压调速。

2、无刷马达调速过程是马达的供电电源的电压不变,改变电调的控制信号,通过微处理器再改变大功率MOS管的开关速率,来实现转速的改变。这一过程被称之为变频调速。

三、电机芯片介绍

1.L293D芯片

2.L298N芯片

L298N驱动模块,可以驱动2个直流电机,可分别实现正转,反转功能.

  1. 具有信号指示。
  2. 转速可调
  3. 抗干扰能力强
  4. 具有过电压和过电流保护
  5. 可单独控制两台直流电机
  6. 可单独控制一台步进电机
  7. PWM脉宽平滑调速
  8. 可实现正反转

四、直流电机的控制实例

使用直流/步进两用驱动器可以驱动两台直流电机。分别为M1和 M2。引脚A,B可用于输入PWM脉宽调制信号对电机进行调速控 制。(如果无须调速可将两引脚接5V,使电机工作在最高速状态, 既将短接帽短接)实现电机正反转就更容易了,输入信号端IN1接 高电平输入端IN2接低电平,电机M1正转。(如果信号端IN1接低 电平, IN2接高电平,电机M1反转。)控制另一台电机是同样的 方式,输入信号端IN3接高电平,输入端IN4接低电平,电机M2正 转。(反之则反转),PWM信号端A控制M1调速,PWM信号端B 控制M2调速。


五、软件驱动代码编写

电机驱动IO定义–右电机使能IO为例

  1. 相关引脚宏定义

  1. GPIO初始化

  1. 电机运动


  1. 方向控制


总结

基于STM32智能小车的电机控制介绍就到这里

以上是关于stm32中的步进电机驱动和lcd显示问题的主要内容,如果未能解决你的问题,请参考以下文章

42步进电机怎么用stm32控制加减速

51单片机+L298驱动步进电机+L297测速+LCD1602显示+按键调试+Proteus仿真

基于STM32的智能小车--电机驱动设计

求STM32驱动电路 (10路24继电器和2路步进电机驱动器)

stm32控制步进电机回零

Proteus仿真51单片机+按键控制步进电机驱动+LCD1602显示