datasheet

STM32学习笔记——PWM基础知识与720电机驱动

2019-01-09来源: eefocus 关键字:STM32  PWM  电机驱动

1. 定义

脉冲宽度调制:是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。(百度百科)它是一种对模拟信号电平进行数字编码的方法,通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形(含形状和幅值)。


**SPWM波形:**脉冲宽度按正弦规律变化而和正弦波等效的 PWM 波形。



把正弦半波波形分成N等份,就可把正弦半波看成由N个彼此相连的脉冲所组成的波形。如果把上述脉冲序列用同样数量的等幅而不等宽的矩形脉冲序列代替,使矩形脉冲的中点和相应正弦等分的中点重合,且使矩形脉冲和相应正弦部分面积(即冲量)相等,就得到一组脉冲序列,这就是PWM波形。根据冲量相等,效果相同的原理,PWM波形和正弦半波是等效的,如上图。


pwm的频率:指每秒钟信号从高电平到低电平再回到高电平的次数。


**占空比:**输出的PWM中,高电平保持的时间与该 PWM 的时钟周期的时间之比。


**分辨率:**是占空比最小能达到多少,如8位的PWM:理论的分辨率就是1:255(单斜率), 16位的的PWM理论就是1:65535(单斜率)。


PWM 是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。


PWM 调制出的交流电压值主要取决于我们所控制的占空比(电压 = 占空比 X 幅值),调制出来的交流电压的波形精度取决于所设定的载波频率。


2. 电机驱动

对于 PWM 波的输出配置,可以参考STM32学习笔记一一PWM 输出


2.1 电路连接:



2.2 软件实现:

头文件:

#ifndef __MOTOR__H_

#define __MOTOR__H_


#include "system.h"


#define MOTOR1_PWM GPIO_Pin_6


#define MOTOR_PWMMAX 1000


void MOTOR_GPIO_Init(void);

void TIM3_PWM_Init(void);

void MOTOR_Control(int16_t motor1_pwm);


#endif

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15


/******************************************************************************************

* 函  数:void MOTOR_GPIO_Init(void)

* 功  能:电机引脚初始化

* 参  数:无

* 返回值:无

* 备  注:TIM3 CH1(PWM1) -> PA6

*******************************************************************************************/

void MOTOR_GPIO_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);


GPIO_InitStructure.GPIO_Pin = MOTOR1_PWM;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // GPIO复用推挽输出

GPIO_Init(GPIOA,&GPIO_InitStructure);

//GPIO_SetBits(GPIOA,MOTOR1_PWM);

}


/******************************************************************************************

* 函  数:void TIM3_PWM_Init(void)

* 功  能:定时器输出和PWM配置

* 参  数:无

* 返回值:无

* 备  注:TIM3 CH1

*******************************************************************************************/

void TIM3_PWM_Init(void)

{

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; //定时器变量

TIM_OCInitTypeDef TIM_OCInitStructure; //输出比较结构体变量


RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);


TIM_TimeBaseInitStructure.TIM_Period = 1000-1; //设置自动重装载的周期值;f=72M/1000=72KHz

TIM_TimeBaseInitStructure.TIM_Prescaler = 100; //设置预分频值

TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式

TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割

TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);


TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //PWM1模式

TIM_OCInitStructure.TIM_Pulse = 0; //初始化占空比为0

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//输出极性高

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能

TIM_OC1Init(TIM3,&TIM_OCInitStructure);

TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable); //使能TIMx在ARR上的预装载寄存器


TIM_Cmd(TIM3,ENABLE);

}


测试:


#include "stm32f10x.h"

#include "led.h"

#include "systick.h"

#include "motor.h"


int main(void)

{

uint8_t dir=1;

uint16_t motor1_pwmval=0;

SysTick_Init();

LED_Init();

MOTOR_GPIO_Init();

TIM3_PWM_Init();


while(1)

{

USER_LED_ON();

delay_ms(500);

USER_LED_OFF();

delay_ms(500);



if(dir)

motor1_pwmval++;

else 

motor1_pwmval--;  

  if(motor1_pwmval>999)

dir=0;

if(motor1_pwmval==0)

dir=1;      

TIM_SetCompare1(TIM3,motor1_pwmval); //设置占空比0-999

}

}



连接好电路,下载程序,可观察到小电机停止–转动–停止循环。


关键字:STM32  PWM  电机驱动

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/mcu/2019/ic-news010942846.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32程序移植技巧总结
下一篇:STM32驱动NRF24L01

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM32:STM32库函数配置

stm32 固件库V3.0以上的版本,main等源文件中不再直接包含stm32f10x_conf.h,而是stm32f10x.h,stm32f10x.h则定义了启动设置,以及所有寄存器宏定义,此文件中需要注意的有:使用V3.0以上版本固件库的方法如下:1.选择device(配置函数STM32F10x.h,具体配置方法如下)在STM32F10x.h中有如下代码:#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined
发表于 2019-01-17
STM32:STM32库函数配置

STM32:STM32学习记录1:MDK基本数据类型及代码优化

大概一年前开始接触STM32,当时就被它的库函数开发所吸引,但是迫于各种压力放弃了学习,一直在使用所谓稳定的单片机来开发(忍不住要吐槽),现在终于有时间了,开始自己的兴趣之旅喽!!现在网上有各种大牛的经验文档使我受益匪浅,也感谢室友的无私帮助!!!大概看了一下大牛的经验文档,好像没有一个提到MDK的基本数据类型的,自己找找看在MDK的帮助里面有。打开MDK-----help----uVision help----RealView Compiler Reference Guide----C and C++ implementation details----C and C++ implementation
发表于 2019-01-17
STM32:STM32学习记录1:MDK基本数据类型及代码优化

STM32:STM32学习记录5: 外部中断

配置流程:1:系统时钟初始化,包括系统时钟和要开放的IO口或者功能的时钟配置。2:IO口初始化,包括引脚,速率,输入输出模式等。3:NVIC 中断向量配置 ,中断向量基地址和优先级的配置。4:EXTI 中断/事件控制器,使能或失能外部线路,使能的模式(事件请求和中断请求),边沿触发模式,状态等。说明:1:主函数写在main.c中,中断函数写在stm32f10x_it.c 中,找到相应的中断函数(一般都是空白),加入自己的中断代码即可。2:中断函数名在startup_stm32f10x_xx.s中查阅3:清除 EXT13 线路的挂起位  注意此处一定要清除!!!!!!!!在EXTI_PR寄存器中3:NVIC一般配
发表于 2019-01-17

STM32学习记录——printf函数重定位

功能: 重定位printf函数,使printf作为串口打印输出函数。代替usart_send_string()函数步骤: usart.c中包含USART初始化函数 1、USART初始化(使能时钟、使能GPIO、GPIO和USART初始化) 2、打开USART 3、在usart.c中加入如下代码#ifdef __GNUC__     /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf      
发表于 2019-01-17

STM32USART串口调节与printf重定义

首先,printf重定义后可以直接使用printf函数从串口发送数据在usart.c中添加代码:#ifdef __GNUC__  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf     set to 'Yes') calls __io_putchar() */  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)#else  #define PUTCHAR_PROTOTYPE int f
发表于 2019-01-17

STM32中使用标准库重定义printf()函数

//重定义函数1PUTCHAR_PROTOTYPE{ /* Place your implementation of fputc here */ /* e.g. write a character to the USART */  USART_SendData(USART1, (uint8_t) ch);   /* 循环等待直到发送结束*/  while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)  {}   return ch;}//重定义函数2 int fputc
发表于 2019-01-17

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2018 EEWORLD.com.cn, Inc. All rights reserved