基于STM32直流电机控制程序
基于STM32的直流电机PID调速系统设计

《计算机控制技术课程设计》题目:基于STM32的直流电机PID调速学院:计算机与电子信息学院专业:电气工程及其自动化班级:电气12-5 学号: 12034320515 姓名:任课教师:完成时间: 2015.11.18——2015.12.30基于STM32的直流电机PID调速摘要电机转速控制在运动控制系统中占有至关重要的地位,本设计将电机转速控制作为研究对象;以PID为基本控制算法,STM32F103单片机为控制核心,产生受PID算法控制的PWM脉冲实现对直流电机转速的控制。
同时利用光电传感器将电机速度转换成脉冲频率反馈到单片机中,实现转速闭环控制,达到转速无静差调节的目的。
在系统中采320×240TFTLCD显示器作为显示部件,通过4个按键通过界面切换方式设置P、I、D、V四个参数和正反转控制,启动后可以通过显示部件了解电机当前的运行状态和系统的CPU温度。
该系统控制精度高,具有很强的抗干扰能力。
关键词:PID 直流电机反馈调节Based on the STM32 PID speed control of dc motorAbstractMotor speed control occupies a crucial position in the motion control system, the design of the motor speed control for the study; in the basic PID control algorithm, STM32F103 microcontroller core, by the PID control algorithm generates a PWM pulse to achieve DC speed control. At the same time the use of photoelectric sensors to convert the motor speed to pulse frequency feedback to the microcontroller to achieve closed-loop speed control, to speed static error adjustment purposes. Mining 320 ×240TFTLCD monitor as a display unit in the system, through four key settings P, I, D, V four parameters and reversing control through the interface switching mode, start to understand the current state of the motor and the system through the display unit CPU temperature. The system control and high precision, has a strong anti-jamming capability.Keywords: PID DC motor feedback regulation目录1. 绪论 (1)1.1研究背景与意义 (1)1.2本文主要研究方法 (1)2. 设计方案与论证 (2)2.1系统设计方案 (2)2.2控制器模块设计方案 (2)3. 系统硬件电路设计 (3)3.1整体电路设计 (3)3.1.1整体理论 (3)3.1.2整体简单结构图和资源分配图 (3)3.2最小单片机系统设计 (4)3.2.1STM32F103复位电路 (6)3.2.2电源电路 (6)3.3电机驱动电路设计 (7)3.4光电码盘编码器电路设计 (7)3.5显示电路设计 (8)3.6按键电路设计 (10)4. 系统软件设计 (10)4.1PID算法 (10)4.2PID参数整定方法 (11)4.3电机速度采集算法 (12)4.4程序流程图 (12)5. 系统调试 (13)5.1软件调试 (13)5.2系统测试与分析 (14)6. 总结与展望 (15)参考文献 (16)附录一部分程序源程序 (17)附录二系统界面实物图和PCB图 (20)1.绪论1.1研究背景与意义电动机在现代的工业中,是主要的驱动设备,尤其是直流电动机,由于它的平滑调速性和结构上的简单,使其成为许多电器,如洗衣机,电梯等的驱动。
STM32直流电机控制程序简明教程

STM32直流电机控制程序简明教程1.硬件准备首先,我们需要准备好所需的硬件:-STM32开发板-直流电机-驱动器电路,如L298N或L293D-电源供应器(一般是12V直流电源)2.硬件连接将STM32开发板与驱动器电路连接,并将直流电机连接到驱动器电路上。
确保连接正确并牢固。
3.硬件初始化打开STM32开发环境(如Keil),创建一个新的工程。
然后,将需要的库文件添加到工程中,并根据开发板型号选择正确的芯片库。
接下来,配置和初始化GPIO引脚,用于连接和控制驱动器电路。
4.设置PWM输出利用STM32的PWM功能,我们可以产生一个周期性的方波信号来控制驱动器电路。
根据需要,配置一个或多个PWM输出引脚,并设置PWM的频率和占空比。
5.编写控制程序在主函数中,编写控制程序,以实现所需的电机控制功能。
以下是一些常见的功能:-正转和反转方向控制:使用GPIO引脚将方向信号发送至驱动器电路。
-速度控制:根据需要,使用PWM输出调整电机的速度。
-停止和启动:通过打开和关闭PWM输出,可以停止和启动电机。
7.测试和调试将电机供电,并通过调整控制程序中的参数,测试电机的正转、反转、速度控制等功能。
根据需要,可以使用调试工具来调试和优化程序。
总结:通过以上几个步骤,我们可以使用STM32控制直流电机。
请记住,在实际应用中,还可能需要处理其他问题,例如加速和减速控制、电机保护等。
希望这个简明教程能够帮助您入门直流电机控制,并且能够在您的项目中发挥作用。
如果您需要更详细的信息,建议参考STM32的官方文档和相关资料。
基于STM32的直流电机PWM调速控制

(《嵌入式系统及接口技术》课程大作业)课程名称:嵌入式系统及接口技术班级专业:姓名学号:指导老师:电动摩托车控制器中的电机PWM调速摘要:随着“低碳”社会理念的深入,新型的电动摩托车发展迅速,逐渐成为人们主要的代步工具之一,由于直流无刷电机的种种优点,在电动摩托车中也得到了广泛应用,因此,本文控制部分主要介绍一种基于STM32F103芯片的新型直流无刷电机调速控制系统,这里主要通过PWM技术来进行电机的调速控制,且运行稳定,安全可靠,成本低,具有深远的意义。
1.总体设计概述1.1 直流无刷电机及工作原理直流无刷电机(简称BLDCM),由于利用电子换向取代了传统的机械电刷和换向器,使得其电磁性能可靠,结构简单,易于维护,既保持了直流电机的优点又避免了直流电机因电刷而引起的缺陷,因此,被广泛应用。
另外,由于直流无刷电机专用控制芯片价格昂贵,本文介绍了一种基于STM32的新型直流无刷电机控制系统,既可降低直流无刷电机的应用成本,又弥补了专用处理器功能单一的缺点,具有重要的现实意义和发展前景。
工作原理:直流无刷电机是同步电机的一种,其转子为永磁体,而定子则为三个按照星形连接方式连接起来的线圈,根据同步电机的原理,如果电子线圈产生一个旋转的磁场,则永磁体的转子也会随着这个磁场转动因此,驱动直流无刷电机的根本是产生旋转的磁场,而这个旋转的磁场可以通过调整A、B、C三相的电流来实现,其需要的电流如图1所示随着我国经济和文化事业的发展,在很多场合,都要求有直流电机PWM调速系统来进行调速,诸如汽车行业中的各种风扇、刮水器、喷水泵、熄火器、反视镜、宾馆中的自动门、自动门锁、自动窗帘、自动给水系统、柔巾机、导弹、火炮、人造卫星、宇宙飞船、舰艇、飞机、坦克、火箭、雷达、战车等场合。
1.2 总体设计方案总体设计方案的硬件部分详细框图如图1所示。
图1 总体方案系统框图该方案主要运行状况如下:通过摩托车车把的转动来改变其机械位置,然后这个变量通过ADC 转换后,传送其调速信号给STM32F103,另外,霍尔传感器将其对电机速度的检测信号也传送给STM32,在STM32中,首先根据ADC 的值改变PWM 波形,并且与霍尔传感器的检测信号进行叠加,最终输出叠加后的PWM 波形给功率驱动电路,从而驱动电机并对其进行速度的控制和调节。
STM32直流电机控制程序简明教程

STM32直流电机控制程序简明教程在本教程中,我们将介绍如何在STM32微控制器上控制直流电机。
我们将使用PWM信号以及相关的GPIO引脚来控制直流电机的转速和方向。
以下是一个简明的步骤指南。
步骤1:准备工作首先,我们必须准备一个STM32开发板,例如STM32F103C8T6、确保你已经安装了相关的开发环境,包括STM32CubeMX和MDK-ARM等。
在开始编程之前,请确保你理解基本的STM32寄存器和寄存器映射。
步骤2:连接硬件将直流电机连接到STM32开发板的GPIO引脚。
通常情况下,直流电机需要连接到H桥驱动器以控制转向。
你可以参考直流电机的数据手册来了解如何正确地连接到H桥驱动器和STM32开发板。
步骤3:配置STM32微控制器使用STM32CubeMX配置STM32微控制器的GPIO引脚和定时器,以便生成PWM信号。
选择合适的时钟源和预分频器来获得所需的PWM频率。
记住,PWM信号的频率应该比直流电机的转速控制要求高得多。
步骤4:编写控制程序在MDK-ARM中创建一个新的C文件,并编写控制直流电机的程序。
使用GPIO库和定时器库来配置和控制GPIO引脚和定时器。
在程序中,我们可以通过调整PWM的占空比来改变直流电机的转速和方向。
以下是一个简单的示例代码,用于将直流电机以不同的速度顺时针和逆时针旋转:```c#include "stm32f1xx.h"//定义PWM周期和占空比的最大值和最小值#define MAX_PWM_PERIOD 1000#define MIN_PWM_PERIOD 100//定义PWM的占空比和周期变量uint32_t pwm_period = MAX_PWM_PERIOD;uint32_t pwm_duty = MAX_PWM_PERIOD / 2;int main(void)//初始化GPIO引脚RCC->APB2ENR,=RCC_APB2ENR_IOPBEN;//使能GPIOB时钟GPIOB->CRL&=~(GPIO_CRL_MODE0,GPIO_CRL_CNF0);//将PB0设置为输出GPIOB->CRL,=GPIO_CRL_MODE0_0;//初始化定时器RCC->APB1ENR,=RCC_APB1ENR_TIM4EN;//使能TIM4的时钟TIM4->PSC=72-1;//设置预分频器72,得到1MHz的计数频率TIM4->ARR = pwm_period - 1; // 设置PWM周期TIM4->CCR1 = pwm_duty; // 设置PWM占空比//配置TIM4通道1为PWM模式1TIM4->CCMR1,=TIM_CCMR1_OC1M_2,TIM_CCMR1_OC1M_1; TIM4->CCMR1&=~TIM_CCMR1_OC1M_0;TIM4->CCER,=TIM_CCER_CC1E;//使能通道1//开启定时器TIM4->CR1,=TIM_CR1_CEN;while(1)//逐渐增加占空比,实现顺时针旋转for(uint32_t i = 0; i < pwm_period; i++)TIM4->CCR1=i;delay_ms(10);}//延时delay_ms(1000);//逐渐减小占空比,实现逆时针旋转for(uint32_t i = pwm_period; i > 0; i--)TIM4->CCR1=i;delay_ms(10);}//延时delay_ms(1000);}//延时函数void delay_ms(uint32_t ms)for (volatile uint32_t i = 0; i < ms * 1000; i++);```在上面的示例代码中,我们使用TIM4定时器和PB0引脚来生成PWM信号,并控制直流电机的转速和方向。
基于STM32的电动摩托车无刷直流电机控制器的设计-毕业论文

2015届毕业生毕业论文题目: 基于STM32的电动摩托车无刷直流电机控制器的设计2015 年5月20日摘要电动摩托车具有零排放、低噪声等许多优点,是现代绿色环保交通工具,由于比较方便、快捷,所以许多人选择它作为自己的出行工具,成为大中城市公共交通的补充。
电动摩托车上一般用的都是无刷直流电机,所以电动摩托车控制器的质量非常重要。
本文首先介绍了无刷直流电机结构和换向原理,紧接着介绍了波脉宽调速原理直和流无刷电机的工作原理。
然后做相关的电路图设计,主控芯片的选择、电流检测电路、霍尔位置传感器信号检测电路、电源转换与电压采样电路、电机驱动电路设计、刹车和调速电路设计、STM32 芯片无刷电机控制接口电路,这些电路图设计是控制器的关键部分。
接着叙述了软件部分的设计,主要包括:主程序的设计、过流保护、欠压保护、电制动程序等。
通过输入程序可以改变PWM波的占空比,所以电枢电压的大小也可以调节,进而调节转速。
最后采用STM32单片机为控制核心,设计了电流检测保护电路、位置信号检测电路、电源转换电路、欠压保护电路等,由于单片机成本低、功能强大、运算能力强等优点,提高了控制系统的可靠性的同时,也降低了控制成本。
我们不仅完成电机控制器的设计,同时也加深了相关知识的理解和联系。
关键词:无刷直流电机、stm32、电路设计、目录1、绪论 (3)1.1电动车的现状 (3)1.2研究电动车的意义 (4)1.3本论文的主要工作 (4)2无刷直流电机控制系统的设计 (5)2.1. 直流无刷电机的结构 (5)2.2 直流无刷电机的工作原理和控制方法 (6)2.3 单片机选型 (8)2.4 无刷直流电机选型 (11)3系统硬件电路的设计 (13)3.1硬件系统总体结构设计 (13)3.2电源电路设计 (13)3.3无刷直流电机霍尔位置传感器接口电路设计 (14)3.4 刹车和调速电路设计 (15)3.5过流保护电路 (16)3.6三相全桥驱动电路 (17)3.7 过压、欠压保护电路 (18)4系统软件设计 (19)4.1 系统整体软件设计 (20)4.2直流无刷电机控制的软件设计 (22)4.3系统各部分功能在软件中的实现 (24)4.4 STM32检测霍尔信号和输出PWM软件设计 (25)5.总结和展望 (27)致谢 (29)参考文献 (30)附录 (31)1、绪论1.1电动车的现状随着我国经济的快速发展和城市化进程的加快,机动车保有量逐渐增加,环境污染也因此越来越严重,所以寻找低排放的技术和可再生资源称为一个重要课题。
基于STM32的直流电机PID调速系统设计

基于STM32的直流电机PID调速系统设计一、引言直流电机调速系统是现代工业自动化系统中最常用的电机调速方式之一、它具有调速范围广、响应快、控制精度高等优点,被广泛应用于电力、机械、石化、轻工等领域。
本文将介绍基于STM32单片机的直流电机PID调速系统的设计。
二、系统设计直流电机PID调速系统主要由STM32单片机、直流电机、编码器、输入和输出接口电路等组成。
系统的设计流程如下:1.采集反馈信号设计中应通过编码器等方式采集到反馈信号,反应电机的转速。
采集到的脉冲信号经过处理后输入给STM32单片机。
2.设计PID算法PID调节器是一种经典的控制算法,由比例(P)、积分(I)和微分(D)三个部分组成,可以根据实际情况调整各个参数的大小。
PID算法的目标是根据反馈信号使电机达到期望的转速。
3.控制电机速度根据PID算法计算出的偏差值,通过调节电机的占空比,实现对电机速度的控制。
当偏差较大时,增大占空比以加速电机;当偏差较小时,减小占空比以减速电机。
4.界面设计与控制设计一个人机交互界面,通过该界面可以设置电机的期望转速以及其他参数。
通过输入接口电路将相应的信号输入给STM32单片机,实现对电机的远程控制。
5.系统保护在电机工作过程中,需要保护电机,防止出现过流、超速等问题。
设计一个保护系统,能够监测电机的工作状态,在出现异常情况时及时停止电机工作,避免损坏。
6.调试与优化对系统进行调试,通过实验和测试优化PID参数,以获得更好的控制效果。
三、系统实现系统实现时,首先需要进行硬件设计,包括STM32单片机的选型与外围电路设计,以及输入输出接口电路的设计。
根据实际情况选择合适的编码器和直流电机。
接着,编写相应的软件代码。
根据系统设计流程中所述,编写STM32单片机的控制程序,包括采集反馈信号、PID算法实现、控制电机速度等。
最后,进行系统调试与优化。
根据系统的实际情况,调试PID参数,通过实验和测试验证系统的性能,并进行优化,以实现较好的控制效果。
基于STM32的直流电机伺服控制系统
基于STM32的直流电机伺服控制系统作者:郑凯强赖惠鸽吴凤民来源:《科技风》2016年第18期摘要:本文设计了一种以STM32VET6微控制器作为控制核心的有刷直流电机伺服驱动器。
系统以光电编码器为速度与位移传感器且带有电流采样电路,还具有基于PWM和H桥的电机驱动电路,并通过数字PID控制策略,实现直流电机的三环控制。
实际测试表明,系统具有控制精确、稳定性好和结构简单等特点。
关键词:STM32;伺服驱动器;PID有刷直流电机作为最早出现的电机因其结构简单性能良好得到了广泛的应用。
随着对控制精度要求的提高,传统的控制方法已经无法达到控制精度的需求。
本文利用STM32VET6微控制器设计了一种H桥直流电机伺服驱动器,实现了有刷直流电机的速度、位移、电流三环控制。
1 系统整体结构伺服驱动器采用STM32VET6微控制器为核心控制芯片,主频为72MHz,芯片内部集成USART与CAN控制器,具有2 个12 位模数转换器,8个定时器,满足采样与定时的要求,外接各类扩展模块,共同构成伺服驱动器整体。
伺服驱动器整体架构图如图1所示。
2 驱动器硬件结构驱动器的硬件结构主要分为两大部分。
上板控制电路用于接收光电编码器的反馈信息运行控制算法,下板则将上板产生的PWM信号进行功率放大用于驱动电机运行。
1)通信模块。
为了提高该伺服驱动器的通用性与实用性,使驱动器具有极强的扩展性能,该驱动器采用双通信方式。
利用MAX232芯片进行串口通信,82C250芯片进行CAN通信,不仅使驱动器便于与PC机软件进行测试以调整控制参数优化驱动器性能,还使驱动器满足各种工业场合的使用需求。
2)电流采样模块。
要实现电动机的电流环控制,则必须先对电机的电流进行采样。
串电阻检测电流的电路结构清晰,成本低,实时性好,精度较高。
所以本驱动器采用串电阻检测电流方式,通过STM32芯片的ADC模块读取数据,将获得的电流数据通过控制器的PID算法进行调整以达到精确的电流输出。
基于stm32的无刷直流电机控制系统设计
基于STM32的无刷直流电机控制系统设计随着现代工业技术的不断发展,无刷直流电机在各行各业中得到了广泛的应用。
无刷直流电机具有结构简单、效率高、寿命长等优点,因此在工业控制系统中得到了广泛的应用。
为了更好地满足工业生产的需求,研发出一套基于STM32的无刷直流电机控制系统,对于提高工业生产效率、减少人力成本具有非常重要的意义。
1. 系统设计需求1.1 电机控制需求电机控制系统需要能够实现对无刷直流电机的启动、停止、加速、减速等控制功能,以满足不同工业生产环境下的需求。
1.2 控制精度要求控制系统需要具有较高的控制精度,能够实现对电机的精确控制,提高生产效率。
1.3 系统稳定性和可靠性系统需要具有良好的稳定性和可靠性,确保在长时间运行的情况下能够正常工作,减少故障率。
1.4 节能环保控制系统需要具有节能环保的特点,能够有效降低能耗,减少对环境的影响。
2. 系统设计方案2.1 选用STM32微控制器选用STM32系列微控制器作为控制系统的核心,STM32系列微控制器具有性能强大、低功耗、丰富的外设接口等优点,能够满足对控制系统的各项要求。
2.2 传感器选型选用合适的传感器对电机运行状态进行监测,以实现对电机的精确控制,提高控制系统的稳定性和可靠性。
2.3 驱动电路设计设计合适的驱动电路,能够实现对无刷直流电机的启动、停止、加速、减速等控制,并且具有较高的控制精度。
2.4 控制算法设计设计优化的控制算法,能够实现对电机的精确控制,提高控制系统的稳定性和可靠性,同时具有节能环保的特点。
3. 系统实现与测试3.1 硬件设计按照系统设计方案,完成硬件设计,并且进行相应的电路仿真和验证。
3.2 软件设计编写控制系统的软件程序,包括控制算法实现、传感器数据采集和处理、驱动电路控制等方面。
3.3 系统测试对设计好的控制系统进行各项功能测试,包括启动、停止、加速、减速等控制功能的测试,以及系统稳定性和可靠性的测试。
基于STM32的直流电机PID调速系统设计
《计算机控制技术课程设计》题目:基于STM32的直流电机PID调速学院:计算机与电子信息学院专业:电气工程及其自动化班级:电气12-5 学号:姓名:任课教师:完成时间:——基于STM32的直流电机PID调速摘要电机转速控制在运动控制系统中占有至关重要的地位,本设计将电机转速控制作为研究对象;以PID为基本控制算法,STM32F103单片机为控制核心,产生受PID算法控制的PWM脉冲实现对直流电机转速的控制。
同时利用光电传感器将电机速度转换成脉冲频率反馈到单片机中,实现转速闭环控制,达到转速无静差调节的目的。
在系统中采320×240TFTLCD显示器作为显示部件,通过4个按键通过界面切换方式设置P、I、D、V四个参数和正反转控制,启动后可以通过显示部件了解电机当前的运行状态和系统的CPU温度。
该系统控制精度高,具有很强的抗干扰能力。
关键词:PID 直流电机反馈调节Based on the STM32 PID speed control of dc motorAbstractMotor speed control occupies a crucial position in the motion control system, the design of the motor speed control for the study; in the basic PID control algorithm, STM32F103 microcontroller core, by the PID control algorithm generates a PWM pulse to achieve DC speed control. At the same time the use of photoelectric sensors to convert the motor speed to pulse frequency feedback to the microcontroller to achieve closed-loop speed control, to speed static error adjustment purposes. Mining 320 × 240TFTLCD monitor as a display unit in the system, through four key settings P, I, D, V four parameters and reversing control through the interface switching mode, start to understand the current state of the motor and the system through the display unit CPU temperature. The system control and high precision, has a strong anti-jamming capability.Keywords: PID DC motor feedback regulation目录1. 绪论 (1)研究背景与意义 (1)本文主要研究方法 (1)2. 设计方案与论证 (2)系统设计方案 (2)控制器模块设计方案 (2)3. 系统硬件电路设计 (3)整体电路设计 (3)整体理论 (3)整体简单结构图和资源分配图 (3)最小单片机系统设计 (4)STM32F103复位电路 (6)电源电路 (6)电机驱动电路设计 (7)光电码盘编码器电路设计 (7)显示电路设计 (8)按键电路设计 (10)4. 系统软件设计 (10)PID算法 (10)PID参数整定方法 (11)电机速度采集算法 (12)程序流程图 (12)5. 系统调试 (13)软件调试 (13)系统测试与分析 (14)6. 总结与展望 (15)参考文献 (16)附录一部分程序源程序 (17)附录二系统界面实物图和PCB图 (20)1.绪论1.1研究背景与意义电动机在现代的工业中,是主要的驱动设备,尤其是直流电动机,由于它的平滑调速性和结构上的简单,使其成为许多电器,如洗衣机,电梯等的驱动。
一种基于STM32的PID直流电机控制系统
为微分时间常量。
位置式 PID 算法是根据当前实际位置与要达到的预
期位置的偏差,进行 PID 控制。将每一次的误差进行累
加作为积分,其运算量大,每次输出均与过去的状态相
关,缺点是可能会引起大幅度超调。
1.2 增量式PID算法
增量式 PID 算法的表达式为
= ∆u (k )
Kp [e(k) − e(k
图2 硬件系统整体流程图
2.1 电机驱动模块L298N 本 文 选 用 L298N 为 驱 动 模 块, 其 电 路 中 包 含 有
两个 H 桥的高电压大电流双桥式驱动器。在使用中, STM32F103 配置的 PWM 输出引脚直接给该模块提供 变占空比的信号,方便控制。
其控制状态表见表 1。L298N 电机驱动模块可以实 现电机的调速与正反转,此次研究只使用其驱动一台二 相直流电机构成闭环调速系统,根据表 1 配置 IN1(输入) 与 IN2,对使能端输出 PWM 脉冲,即可实现变占空比 调速。
系统对电机的输出轴分别进行转速设定 , [13] 分别设定 了 190 rpm、220 rpm、250 rpm、280 rpm、310 rpm、 340 rpm、370 rpm、400 rpm、410 rpm、420 rpm、 430 rpm,实际测量结果如表 2,数据进行了误差计算。
表2 转速数据采集及误差计算
3 软件整体流程
此次研究以 Keil MDK 作为编译开发环境,软件部 分的重点是 PID 控制的处理。流程图如图 4,主要包括 主程序、PID 处理、外部中断、定时中断、PWM 的输 出和编码器的脉冲计数。
2.2 编码器测速模块 编码器为 AB 相增量式霍尔编码器,输出标准的方
波,STM32F103 自带的编码器模式可直接读取脉冲信 号,AB 相编码器的 A 相、B 相互相延迟四分之一周期 输出脉冲。如图 3 为编码器的输出波形,取 A 相、B 相 的上升沿和下降沿都作为脉冲,可以取得二倍频或四倍 频。四倍频采样可提高系统运算时的精确性。通过每 10 ms 读取处理一次编码器脉冲,可以测得电机速度和 处理控制,此次使用四倍频采样,有提高系统运算精确 性的优势。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
STM32 直流减速电机控制
直流减速电机控制中,最常用的方法就是通过PWM来控制直流电机的转速。
在控制小车走直线的过程中,需要两者的转速一置(如果要走得很直,还需要在短时间内保证两者的行程大致相当,这可以用PID算法来控制,以后的文章中会专门叙述)。
因此,在检测到两者转速不一样时,需要动态调整其中一个或两个轮子的PWM的点空比(简单点的就以一个轮为基准,调整另外一个轮子即可;如果以一个固定的标准的话,需要调整两个轮子的PWM占空比)。
程序第一步:设置GPIO,略(输出PWM的管脚用Mode_AF_PP即可)
程序第二步:设置定时器,(保证产生两路PWM即可,我用的是TIM4)
void TIM4_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
//时间基初始化
TIM_TimeBaseInitStructure.TIM_Period=144; //18K/144=125Hz,这个是电机PWM的频率TIM_TimeBaseInitStructure.TIM_Prescaler=4000; //72000000/4000=18K
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0x0000;
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);
//输出比较模式设置,用于4路PWM输出
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2; //输出PWM
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; //使能正向通道
TIM_OCInitStructure.TIM_OutputNState=TIM_OutputState_Disable; //失能反向通道
TIM_OCInitStructure.TIM_Pulse=PWM_L; //左轮DIR的占空比
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low; //输出极性为低电平
TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCPolarity_High;//互补输出极性为高电平
TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Set;
TIM_OCInitStructure.TIM_OCNIdleState=TIM_OCNIdleState_Reset;
TIM_OC1Init(TIM4,&TIM_OCInitStructure); //PWM_L初始化
TIM_OC1PreloadConfig(TIM4,TIM_OCPreload_Disable); //改变点空比后,立即产生效应
TIM_OCInitStructure.TIM_Pulse=PWM_R; //左轮PWM的占空比
TIM_OC2Init(TIM4,&TIM_OCInitStructure); //PWM_R初始化
TIM_OC2PreloadConfig(TIM4,TIM_OCPreload_Disable); //改变点空比后,立即产生效应
//使能定时器4
TIM_Cmd(TIM4,ENABLE);
TIM_CtrlPWMOutputs(TIM4,ENABLE);
}
程序第三步:
在SysTick中断中,读取两个轮子的速(具体的方法是:每0.1秒读一次,并以此人作为速度的依据),并比较,如果以右轮为基准,则调整左轮的PWM占空比。
涉及到关键语句是:TIM_SetCompare1(;)
u16 COUN1=0;
u16 COUN2=0;
volatile u16 Dist_L=0; //左轮行程脉冲数
volatile u16 Dist_R=0; //右轮行程脉冲数
void SysTick_Handler(void)
{
COUN1=TIM1->CNT; //左轮在0.1秒里脉冲数
COUN2=TIM2->CNT; //右轮在0.1秒里脉冲数
Dist_L=Dist_L+COUN1; //左轮行程脉冲数
Dist_R=Dist_R+COUN2; //右轮行程脉冲数
if( (COUN1-COUN2)>2)
{
PWM_L= TIM_GetCapture1(TIM4);
TIM_SetCompare1(TIM4, PWM_L - 4);
}
else if ( (COUN2-COUN1)>2)
{
PWM_L= TIM_GetCapture1(TIM4);
TIM_SetCompare1(TIM4, PWM_L + 4);
}
TIM_SetCounter(TIM1, 0);
TIM_SetCounter(TIM2, 0);
}
关于TIM_SetCompareX(;)这个函数,还是有很多用途的,其中另外一个用途,就是用于产生不同频率的PWM,具体程序如下:
u16 capture = 0;
extern vu16 CCR1_V al;
extern vu16 CCR2_V al;
extern vu16 CCR3_V al;
extern vu16 CCR4_V al;
void TIM2_IRQHandler(void)
{
/* TIM2_CH1 toggling with frequency = 183.1 Hz */ if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET) {
TIM_ClearITPendingBit(TIM2, TIM_IT_CC1 ); capture = TIM_GetCapture1(TIM2);
TIM_SetCompare1(TIM2, capture + CCR1_Val );
}
/* TIM2_CH2 toggling with frequency = 366.2 Hz */ if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET) {
TIM_ClearITPendingBit(TIM2, TIM_IT_CC2); capture = TIM_GetCapture2(TIM2);
TIM_SetCompare2(TIM2, capture + CCR2_Val); }
/* TIM2_CH3 toggling with frequency = 732.4 Hz */ if (TIM_GetITStatus(TIM2, TIM_IT_CC3) != RESET) {
TIM_ClearITPendingBit(TIM2, TIM_IT_CC3); capture = TIM_GetCapture3(TIM2);
TIM_SetCompare3(TIM2, capture + CCR3_Val); }
/* TIM2_CH4 toggling with frequency = 1464.8 Hz */ if (TIM_GetITStatus(TIM2, TIM_IT_CC4) != RESET) {
TIM_ClearITPendingBit(TIM2, TIM_IT_CC4); capture = TIM_GetCapture4(TIM2);
TIM_SetCompare4(TIM2, capture + CCR4_Val); }
}。