系列文章目录

·【STM32】新建工程模板及配置

·【STM32】STM32与PC端、HC-06、ROS进行USART串口通信

·【ROS】ROS上位机使用Serial库和boost::asio库与STM32进行USART通讯

·【STM32】STM32F103C8T6+L298N通过PWM控制直流电机转速

·【STM32】STM32F103C8T6使用外部中断法和输入捕获法进行编码器测速

·【STM32】STM32F103C8T6实现直流电机速度PID控制


目录

系列文章目录

前言

一、PWM调速原理

二、STM32编程实现

总结


前言

原来做的差速小车是基于Arduino控制的,感觉有些简单,也有些基础,Arduino方便简单的同时,可操作性感觉也少了很多,所以想将控制器换成STM32,然后将树莓派作为上位机,STM32作为下位机,通过树莓派和STM32进行通讯,实现对差速移动小车的控制,本人也是寒假期间初学STM32,也是奔着应用去的,所以对于STM32编程原理方面可能不太精通,这里偏重于记录应用层面的知识。


一、PWM调速原理

直流电机驱动是最简单的,给电机通上电就能转,根据电机的公式:

可知:当提高电压时,反电势升高,进而转速升高,电压与转速大致有如图所示的关系

所以我们只要控制给电机通电的电压即可控制电机的转速,但是在实际的控制中,控制直流电机需要通过H桥控制电机的正反转,如图,当T1和T4二极管导通时,有粉色通路;当T2和T3二极管导通时,有蓝色通路,这样我们就可以实现弱电控制强电,通过二极管的通断来控制电机的转向。

但是这样电机通电时电压就是Us,我们如果想自由的控制Us的电压值基本是不能实现的,因为电机是接到单片机的引脚上的,引脚的供电电压值是确定的,我们就要使用控制二极管的通断时间对电机的转速进行控制,即PWM控制。

图中的D1~D4二极管为续流的作用,因为电机中有绕组,在断电后,电感的电流不能瞬时变为0,所以在断电后电流沿棕色和绿色的通路放点。

在一个周期内,我们通过控制通电的时间就可以调控平均电压,而平均电压的高低直接控制电机的转速,通电时间/周期,就可以得到占空比,我们也就是通过控制电机的占空比来控制电机的转速的。

在实际应用过程中,我们不用自己搭建H桥,而是使用电机驱动板(如:L298N)对直流电机进行驱动,L298N内搭载两个H桥电路,可以实现对两个电机的转向和转速进行控制。

这是淘宝商家提供的电机驱动板控制表,将IN1~4接到单片机的引脚,我们就可以通过引脚输出PWM控制信号,对直流电机进行控制。

二、STM32编程实现

在STM32中如果想输出PWM信号,需要借助定时器,通过定时器的捕获/比较通道的PWM输出

当我们对定时器设置了预装载值arr和比较值ccr后,可以通过配置PWM模式,使定时器CNT计数值超过ccr后产生有效信号,并通过配置相应寄存器设置有效信号是1还是0,而配置PWM的输出方式,具体原理信息可以参考原子哥的视频,也可以参考中文参考手册的14.4.7内容。

在程序中,我们使用库函数进行配置,配置步骤如下:

  1. 使能定时器和相关外设引脚时钟 :RCC_APBxPeriphClockCmd()
  2. 配置IO口为复用输出模式(查手册8.1.11)配置成相应的模式(复用推挽输出)
  3. 初始化定时器:TIM_TimeBaseInit()
  4. 初始化TIM2 Channe1234 PWM模式:TIM_OCxInit()
  5. 使能OCx通道的预装载寄存器:TIM_OC1PreloadConfig()
  6. 使能时钟:TIM_Cmd()
  7. 在主函数中配置占空比进行调速:TIM_SetCompare1()
#include "sys.h"/********************
功能:通用时钟2用来产生通道1234四路PWM信号
函数:TIM2_PWM_Init(u16 arr,u16 psc)
作者:K.Fire
日期:2022.01.30
引脚:PA0 PA1 PA2 PA3
参数:arr:自动重装值 psc:时钟预分频数
*****************/void TIM2_PWM_Init(u16 arr,u16 psc)
{  GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;TIM_OCInitTypeDef  TIM_OCInitStructure;//使能GPIOA外设模块时钟  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);   //设置引脚为复用输出功能,输出TIM2 CH1的PWM脉冲波形  GPIOA.0GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //TIM2_CH1GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO//设置引脚为复用输出功能,输出TIM2 CH2的PWM脉冲波形 GPIOA.1GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //TIM2_CH2GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO//设置引脚为复用输出功能,输出TIM2 CH3的PWM脉冲波形 GPIOA.2GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //TIM2_CH3GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO//设置引脚为复用输出功能,输出TIM2 CH4的PWM脉冲波形 GPIOA.3GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //TIM2_CH4GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO//使能定时器2时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);   //初始化TIM2TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位//初始化TIM2 Channe1234 PWM模式    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高TIM_OC1Init(TIM2, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM2 OC1TIM_OC2Init(TIM2, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM2 OC2TIM_OC3Init(TIM2, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM2 OC3TIM_OC4Init(TIM2, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM2 OC4TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);  //使能TIM2在CCR1上的预装载寄存器TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);  //使能TIM2在CCR2上的预装载寄存器TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);  //使能TIM2在CCR3上的预装载寄存器TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);  //使能TIM2在CCR4上的预装载寄存器TIM_Cmd(TIM2, ENABLE);  //使能TIM2}

总结

原理部分我讲的不清晰,我也是看原子哥的视频学的,大家可以通过传送门去B站看原子哥的视频,先更新PWM调速,因为这一部分我测试成功了,等我编码器来了在对编码器和蓝牙进行测试。

【STM32】STM32F103C8T6+L298N通过PWM控制直流电机转速相关推荐

  1. 【在线仿真】Arduino UNO PWM 控制直流电机转速

    [在线仿真]Arduino UNO PWM 控制直流电机转速 在线仿真 接线说明 通过三极管来驱动直流电机电池正极接电机的一端,电机的另一端接到NPN三极管的集电极,三极管的基极接Arduino 11 ...

  2. 树莓派用c语言pwm控制电机,树莓派学习笔记之PWM控制直流电机转速

    树莓派控制PWM控制电机转速 一.硬件 树莓派 12V直流电机 L298N电机驱动器 220V转12V变压器 二.连线 树莓派与L298N需要共地 L298N驱动模块 树莓派接线 三.树莓派pytho ...

  3. (学习)基于STM32的PWM控制直流电机转速(CubeMX+HAL库)

    使用到的各元件: 1.12V电源一个 2.单片机:STM32F103C8T6 3.直流电机4个 4.电机驱动模块:L298N 5.降压模块两个 6:杜邦线若干 对于直流电机的转动控制如下表 两边电平 ...

  4. pwm控制直流电机转速流程图_直流电机的PWM速度控制程序

    * =======直流电机的PWM速度控制程序======== */ /* 晶振采用11.0592M,产生的PWM的频率约为91Hz */ #include #include #define ucha ...

  5. pwm控制直流电机转速流程图_Arduino:直流电机PWM调速

    PWM直流电机调速(代码): int i=0; void Forward(); void Back(); void Turn_left(); void Turn_right(); void Speed ...

  6. pwm控制直流电机转速流程图_PWM直流电机转速控制器电路图

    本例电路由LM324和MOS管组成,通过改变输出方波的占空比,使得负载上的平均接通时间从0到100%变化,以达到调整速度的目的. 电路图讲解: 电路中由LM324组成了四个不同的功能模块: 一是由U1 ...

  7. Arduino应用——PWM控制直流电机风扇

    Arduino应用--PWM控制直流电机风扇 PWM原理 实验器件 功能描述 接线图/原理图 实现代码 结果 最近在使用arduino UNO开发板完成课程小作业.其中一个要求设计一个电风扇控制系统, ...

  8. 基于51单片机的PWM控制直流电机设计( proteus仿真+程序+报告+讲解视频)

    基于51单片机的PWM控制直流电机设计( proteus仿真+程序+报告+讲解视频) 仿真图proteus 7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0031 ...

  9. STM32通用定时器输出PWM控制舵机 —— 重装载值、比较值、当前值

    参考:stm32 定时器输出PWM原理及工作原理+控制舵机 作者:点灯小哥 发布时间: 2021-03-09 23:17:52 网址:https://blog.csdn.net/weixin_4601 ...

  10. 【聆思CSK6 视觉AI开发套件试用】AI控制直流电机转速接口打通

    本篇文章来自极术社区与聆思科技组织的CSK6 视觉AI开发套件活动,更多开发板试用活动请关注极术社区网站.作者:oxlm 背景 在访问极术社区时,偶然发现聆思科技的CSK6开发板的评估活动,看CSK6 ...

最新文章

  1. 平滑迁移 Dubbo 服务的思考
  2. 2000行代码实现软渲染引擎
  3. 怎么复制黑苹果config配置_估计是最后一次折腾黑苹果,技嘉 Z490 Vision D 的 OC 配置分享...
  4. 短信网址价值不大不应被热炒
  5. java1.6 linux_linux java1.6 安装
  6. 【实战HTML5与CSS3 第一篇】初探水深,美丽的导航,绚丽的图片爆炸!!
  7. alibaba fastjson
  8. 信息学奥赛一本通 1144:单词翻转 | OpenJudge NOI 1.7 27
  9. python好用的第三方库_非常有用的 Python 第三方库
  10. 信安教程第二版-第11章网络物理隔离技术原理与应用
  11. 蓝桥杯 ADV-74 算法提高 计算整数因子
  12. 答题小程序 服务器,开源的基于云开发的在线答题小程序
  13. html - <thead>标签
  14. 数据库应用技术课程设计之商城管理系统
  15. java实现多模匹配算法_多模字符串匹配算法-Aho–Corasick
  16. 从java9共享内存加载modules说起
  17. 计算机01无法纯随机,玄不救非,氪不改命 如何分清游戏中的“真随机”和“伪随机”?...
  18. Java程序员可以做哪些副业?
  19. flutter 打包apk
  20. 智慧园区渠道商分销系统开发:打通全渠道信息流,驱动管理数字化透明

热门文章

  1. java 弹弹堂源码_弹弹堂s应用宝版下载
  2. 数学建模安装matlab,数学建模神器——Matlab下载安装教程
  3. 删除Windows网络连接方法
  4. 分布式系统概念与设计——阅读笔记(一)
  5. 制作一个模拟Windows启动界面的文本进度条python
  6. 自己读Go程序设计语言的一些总结(更新ing...)
  7. Linux邮件服务器怎么用?
  8. Linux 如何生成文件的MD5值(md5sum)?
  9. oneno浏览器插件_谷歌浏览器插件Send to OneNote 让Chrome也拥有OneNote的快捷保存功能...
  10. cad墙线打断lisp_autocad 2010怎么打断墙线?