最近在研究电机,于是想写一篇文章来记录我的学习历程。下面是用PWM来驱动电机,涉及的电机驱动是L298N。

大概的思路:初始化连接电机的IO口,配置定时器的PWM模式,配置电机IO口的电平。

代码如下:

#include "moto.c"void MOTO_GPIO_Init(void)
{       /*定义一个GPIO_InitTypeDef类型的结构体*/GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);                                /*开启GPIO的外设时钟*/                                                                 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13;        /*选择要控制的GPIO引脚*/    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                              /*设置引脚模式为通用推挽输出*/   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                             /*设置引脚速率为50MHz */ GPIO_Init(GPIOB, &GPIO_InitStructure);                                  /*调用库函数,初始化GPIO*/            }//电机模式
void MOTO_Mode(char state)
{if(state == GO)//电机前进{GPIO_SetBits(GPIOB,GPIO_Pin_13);GPIO_ResetBits(GPIOB,GPIO_Pin_12);}if(state == BACK)//电机后退{GPIO_SetBits(GPIOB,GPIO_Pin_12);GPIO_ResetBits(GPIOB,GPIO_Pin_13);}if(state == STOP)//停转{GPIO_ResetBits(GPIOB,GPIO_Pin_12);GPIO_ResetBits(GPIOB,GPIO_Pin_13);}} void Car_Go(void)
{MOTO_Mode(GO);
}
#include "timer.h"void MOTO_PWM_Init(u16 arr, u16 psc)
{TIM_OCInitTypeDef TIM_OCInitSructure;GPIO_InitTypeDef    GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);TIM_TimeBaseStructure.TIM_Period = arr;                   //自动重新装载寄存器周期的值TIM_TimeBaseStructure.TIM_Prescaler = psc;                  //时钟分频系数TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;     //对外部时钟进行采样的时钟分频TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);              //参数初始化//TIM_ClearFlag(TIM3, TIM_FLAG_Update);//TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);//配置pwm输出端口GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0|GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   // 复用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);//设置通道3 pwm参数TIM_OCInitSructure.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitSructure.TIM_OutputState= TIM_OutputState_Enable;TIM_OCInitSructure.TIM_Pulse = 2300;        //设置比较值,控制占空比TIM_OCInitSructure.TIM_OCPolarity = TIM_OCPolarity_High;//当定时器计数值小于CCR1_Val时为高电平TIM_OC3Init(TIM3, &TIM_OCInitSructure);//参数初始化TIM_OC3PolarityConfig(TIM3, TIM_OCPreload_Enable);//开始输出pwmTIM_ARRPreloadConfig(TIM3, ENABLE);//启动自动重装TIM_Cmd(TIM3, ENABLE);//启动定时  }

main函数

#include "stm32f10x.h"
#include "moto.h"
#include "timer.h"
#include "sys.h"
#include "delay.h"int main()
{MOTO_GPIO_Init();  //初始化IOMOTO_PWM_Init(3599,0);//配置周期和预分频值delay_init();while(1){      Car_Go();   }}

若觉得这篇文章写得不错,可以点个赞嗷~
附源码PWM控制电机

下篇文章准备写用PID控制电机!想要的话可以关注哦!

STM32——用PWM控制电机相关推荐

  1. stm32电机控制定时器1_STM32通过PWM控制电机速度

    做STM32智能小车的实验中会用到定时器PWM输出,来改变直流电机的转速.分享本文了解如何通过PWM实现对电机速度的控制. PWM控制电机速度的基本原理 PWM(Pulse Width Modulat ...

  2. 用电位器通过STC12C2052AD单片机片内AD和PWM控制电机无极变速

    51CTO提醒您,请勿滥发广告! 用电位器通过STC12C2052AD单片机片内AD和PWM控制电机无极变速 http://51CTO提醒您,请勿滥发广告!/bbs/forum.php?mod=vie ...

  3. STM32 PWM控制电机寄存器配置

    脉冲宽度调制PWM,实现对电机速度的控制. 1.PWM输出原理 假定定时器工作在向上计数 PWM模式,CNT为当前计数值,CCRx为捕获/比较寄存器CCRx的值(预装载值).当 CNT<CCRx ...

  4. STM32循迹小车系列教程(一)—— 使用PWM控制电机

    本章节主要讲解直流减速电机控制原理,电机驱动电路,以及如何使用PWM控制直流减速电机 前言 1.软件准备:STM32CubeMx.Keil5_ MDK 2.硬件准备:STM32F103C8T6核心板. ...

  5. STM32通过PWM控制ESC30C电调

    最近在搞一个水下推进器,这东西的控制其实跟四旋翼的螺旋桨控制差不多.但我也是第一次用STM32板子来控制电调驱动桨叶旋转,因此踩了很多坑.网上找了很多资料,但是很多都写的不是很清楚,这边稍微记录一下怎 ...

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

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

  7. 定时器输出PWM控制电机(程序)

    电机控制程序的三方面要点: 一.定时器的输出通道设置 二.电机频率的设定 三.占空比输入函数的设计 对于电机来说,转速与转向是最重要的表现.这里的程序是针对四个直流无刷电机来编写的. 控制四个电机,是 ...

  8. STM32用pwm开环控制电机如何接线(有图解)

    使用STM32F103pwm控制电机 上一期我们讲了STM32F103pwm控制电机 ,这一期我教大家如何接线 传送门:https://blog.csdn.net/qq_52945606/articl ...

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

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

最新文章

  1. python使用matplotlib可视化subplots绘制子图、自定义几行几列子图,如果M行N列,那么最终包含M*N个子图、在指定的子图中添加可视化结果
  2. Oracle10g OEM乱码解决
  3. 单链表的逆序java_java 实现单链表的逆序
  4. CentOS安装libpcap
  5. 找出现实中符合这三种模式的互联网产品
  6. Coursera自动驾驶课程第10讲:Feedforward Neural Networks
  7. 偷梁换柱 | 无备份情况下的数据恢复实践
  8. winform 图片集合
  9. python进阶22再识单例模式
  10. 测试面经|从测试螺丝钉到大厂测试开发,三点成长心得和面试经验
  11. 最简单例子图解JVM内存分配和回收(转)
  12. 【转】移动前端工作的那些事---前端制作篇之框架篇--jqMobi框架
  13. 贪吃蛇代码--c语言版 visual c++6.0打开
  14. win10wifi多了数字_Win10 技巧:如何修改有线 / WiFi 网络优先级?
  15. 采样准则(时间采样与采样频率)的选取
  16. 互联网思维之用户思维
  17. 暴力电脑锁机生成器(加机械硬盘锁)
  18. 【MOOC】计算机网络与通信技术笔记(北交)(2)物理层
  19. python什么字体好看_七个不一样的Python代码写法,让你写出一手漂亮的代码
  20. 20191009 3. 史上最全的USB-PD充电协议,包含PD协议波形图

热门文章

  1. Glide 源码解析之监听生命周期
  2. js事件冒泡和传播详细解释
  3. window7_64安装STAF
  4. Composer中的ThingWorx模型定义—可视化
  5. 为什么VS2019的解决方案资源管理器中的文件名和文件夹名里的下划线不显示?
  6. Could not publish server configuration for Apache Tomcat v7.0.22 at localhos
  7. 图表示学习之时序的事件和节点动态
  8. So Different You Are
  9. The word 'jsp' is not correctly spelled. Eclipse 拼写检查出错处理办法
  10. HDU 5755 Gambler Bo(数论)