基于GD32驱动BLDC电机(1)定时器和PWM

发布者:Chunjie2022最新更新时间:2024-11-07 来源: elecfans关键字:GD32  定时器  PWM 手机看文章 扫描二维码
随时随地手机看文章

心血来潮买了几个BLDC电机,准备这次就使用苹果派这块板子试一下BLDC电机的控制。


苹果派这块板子的书籍和例程很多,要驱动电机首先要配置定时器,产生可控的PWM脉冲。



趁快递还没到,先学习一下PWM的生成方式:


按照例程和书籍配置寄存器TIMER2:


static  void ConfigTimer2(unsigned short arr, unsigned short psc)

{

  timer_parameter_struct timer_initpara;               //timer_initpara用于存放定时器的参数


  //使能RCU相关时钟 

  rcu_periph_clock_enable(RCU_TIMER2);                 //使能TIMER2的时钟


  timer_deinit(TIMER2);                                //设置TIMER2参数恢复默认值

  timer_struct_para_init(&timer_initpara);             //初始化timer_initpara


  //配置TIMER2

  timer_initpara.prescaler         = psc;              //设置预分频器

  timer_initpara.counterdirection  = TIMER_COUNTER_UP; //设置向上计数模式

  timer_initpara.period            = arr;              //设置自动重装载值

  timer_initpara.clockdivision     = TIMER_CKDIV_DIV1; //设置时钟分割

  timer_init(TIMER2, &timer_initpara);                 //根据参数初始化定时器


  timer_interrupt_enable(TIMER2, TIMER_INT_UP);        //使能定时器的更新中断

  nvic_irq_enable(TIMER2_IRQn, 1, 0);                  //配置NVIC设置优先级

  timer_enable(TIMER2);                                //使能定时器

}

配置PWM输出模式:


static void ConfigTIMER1ForPWMPB10(unsigned short arr, unsigned short psc)

{

  //定义初始化结构体变量

  timer_oc_parameter_struct timer_ocinitpara;

  timer_parameter_struct timer_initpara;

  

  rcu_periph_clock_enable(RCU_GPIOB);    //使能GPIOB时钟

  rcu_periph_clock_enable(RCU_TIMER1);   //使能TIMER1时钟

  rcu_periph_clock_enable(RCU_AF);       //使能TIMER1时钟

  

  gpio_pin_remap_config(GPIO_TIMER1_PARTIAL_REMAP1, ENABLE);  //TIMER1部分重映射TIMER1_CH2- >PB10

  gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10);  //设置GPIO输出模式及速度


  timer_deinit(TIMER1);                                  //将TIMER1配置为默认值

  timer_struct_para_init(&timer_initpara);               //timer_initpara配置为默认值

    

  timer_initpara.prescaler         = psc;                //设置预分频值

  timer_initpara.alignedmode       = TIMER_COUNTER_EDGE; //设置对齐模式

  timer_initpara.counterdirection  = TIMER_COUNTER_UP;   //设置向上计数

  timer_initpara.period            = arr;                //设置重装载值

  timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;   //设置时钟分频因子

  timer_initpara.repetitioncounter = 0;                  //设置重复计数值

  timer_init(TIMER1, &timer_initpara);                   //初始化定时器

    

  //将结构体参数初始化为默认值

  timer_channel_output_struct_para_init(&timer_ocinitpara);  

    

  timer_ocinitpara.outputstate  = TIMER_CCX_ENABLE;                    //设置通道输出状态

  timer_ocinitpara.outputnstate = TIMER_CCXN_DISABLE;                  //设置互补通道输出状态

  timer_ocinitpara.ocpolarity   = TIMER_OC_POLARITY_HIGH;              //设置通道输出极性

  timer_ocinitpara.ocnpolarity  = TIMER_OCN_POLARITY_HIGH;             //设置互补通道输出极性

  timer_ocinitpara.ocidlestate  = TIMER_OC_IDLE_STATE_LOW;             //设置空闲状态下通道输出极性

  timer_ocinitpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;            //设置空闲状态下互补通道输出极性

  timer_channel_output_config(TIMER1, TIMER_CH_2, &timer_ocinitpara);  //初始化结构体

     

  timer_channel_output_pulse_value_config(TIMER1, TIMER_CH_2, 0);                   //设置占空比

  timer_channel_output_mode_config(TIMER1, TIMER_CH_2, TIMER_OC_MODE_PWM0);         //设置通道比较模式

  timer_channel_output_shadow_config(TIMER1, TIMER_CH_2, TIMER_OC_SHADOW_DISABLE);  //失能比较影子寄存器

  timer_auto_reload_shadow_enable(TIMER1);                                          //自动重载影子使能 


  timer_enable(TIMER1);  //使能定时器

}


void  InitPWM(void)

{

  ConfigTIMER1ForPWMPB10(599, 999);  //配置TIMER1,120000000/(999+1)/(599+1)=200Hz

}


void SetPWM(signed short val)

{

  s_iDutyCycle = val;                   //获取占空比的值

  

  timer_channel_output_pulse_value_config(TIMER1, TIMER_CH_2, s_iDutyCycle);  //设置占空比

}

设置主函数:


#include 'Main.h'

#include 'gd32f30x_conf.h'

#include 'SysTick.h'

#include 'RCU.h'

#include 'NVIC.h'

#include 'Timer.h'

#include 'PWM.h'


int main(void)

{

  SystemInit();      

  InitRCU();          

  InitNVIC();           

  InitTimer();         

  InitSysTick();       

  InitPWM();          

  

  SetPWM(100);

  

  while(1)

  {  

     

  }

}


在KEIL中编写好代码后,连接板子上的GD-LINK接口
由于使用GDlink烧录,故在'Target'标签页选择'DEBUG'为“CMSIS-DAP Debugger”
经实测GDLINK的烧录速度较慢,这里可以把时钟频率调整为10MHZ以增快烧录速度

image.png?imageView2/2/w/1000
1702377055707.png?imageView2/2/w/1000

烧录完成后用示波器的探头连接PB10引脚,如图,可以看到清晰的PWM波型

微信图片_20231212183455.jpg?imageView2/2/w/1000

有了PWM之后,控制电机就显得极其简单了。


关键字:GD32  定时器  PWM 引用地址:基于GD32驱动BLDC电机(1)定时器和PWM

上一篇:GD32 MCU碰到IIC总线卡死怎么办?
下一篇:GD32开发实战指南(基础篇) 第8章 定时器

推荐阅读最新更新时间:2026-03-22 12:37

大联大世平集团推出基于NXP等产品的BLDC电机无感方波驱动方案
2023年5月17日, 致力于亚太地区市场的国际领先半导体元器件分销商---大联大控股宣布,其旗下世平推出基于恩智浦(NXP)LPC845芯片的BLDC电机无感方波驱动方案。 图示1-大联大世平基于NXP等产品的BLDC电机无感方波驱动方案的展示板图 在体积更小、功率更高趋势的驱动下,电机的转速一路攀升。并且随着业内对于电机性能要求的不断提高,兼具更高能效与更长寿命BLDC电机受到了广泛关注。在此趋势下,大联大世平基于NXP LPC845芯片推出了BLDC电机无感方波驱动方案,该方案支持反电动势为方波的无传感器高速电机,其电子转速最高可达73000RPM,适用于负载较轻、成本较低的吸尘器、风机等的应用。 图示
[工业控制]
大联大世平集团推出基于NXP等产品的<font color='red'>BLDC电机</font>无感方波<font color='red'>驱动</font>方案
BLDC电机驱动芯片以及解决方案
目前不管是工业自动化领域、汽车领域,还是生活家电领域,各个终端市场对 BLDC 电机控制性能提出了更高的要求。它们不仅需要电机能够做到高效率和多功能控制,还需要电机在追求高转速的同时实现低噪音低振动的控制效果。 与日俱增的高标准性能要求下,越来越多的高性能 BLDC 电机驱动控制芯片在市场高需求和性能高标准两大机遇下涌现。 国内很多厂商都相继推出了 BLDC 电机驱动芯片及解决方案,在性能上较之国际厂商的驱动芯片也不落下风,并且性价比更高,在技术支持上国内厂商也能及时给予客户更多的支持。 纵观国内 BLDC 芯片市场,FOC 几乎已成为标配,各家都在应用了 FOC 的基础上集成更多的外设配置以此来获得更大的竞争力。
[嵌入式]
<font color='red'>BLDC电机</font><font color='red'>驱动</font>芯片以及解决方案
STM32定时器应用——PWM
STM32的定时器有三种,高级定时器(TIM1和TIM8),通用定时器(TIM2、TIM3、TIM4、TIM5)和基本定时器(TIM6和TIM7)。 这三者的区别是: 基本定时器:基本定时器功能比较简单,主要是计时,也可以为DAC提供时钟,直接触发驱动DAC 通用定时器:通用定时器除了基本的定时功能外,还可以测量输入信号的脉冲长度,也就是输入捕获功能,也可以产生输出波形,即输出比较和PWM。 高级定时器:通用定时器有的功能,高级定时器也有,而且高级定时器还可以输出嵌入死区的互补PWM。 这几天放假,在家搜到一个NUCLEO-L010RB的开发板,并且
[单片机]
STM32<font color='red'>定时器</font>应用——<font color='red'>PWM</font>
stm32 定时器输出比较(OC)与PWM的理解和应用
1. 定时器TIM简介 TIM 是 stm32 微控制器中的定时器模块。stm32 包含多个定时器模块,每个定时器模块有不同的功能和配置,适用于各种应用场景。 定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断 不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从模式等多种功能 定时器分类: image.png 基本定时器结构(时基单元): image.png 2. TIM 定时器相关概念 计数模式 向上计数模式(Up-counter mode) 向下计数模式(Down-counter mode) 中心对齐模式(Center-aligned mod
[单片机]
STM32定时器输出PWM 【自用】
PWM1输出模式配置: 1.配置IO(TIM3 PA6~7 CH1 CH2 GPIO_Mode_AF_PP复用推挽输出 50Mhz速度) /*void GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; //GPIOA and GPIOB clock enable RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //GPIOA Configuration: TIM3 channel 1 and 2 as alternate function push-pull GPIO_InitStructure.
[单片机]
STM32F407 基本定时器配置输出PWM方波
介绍STM32F407定时器PWM波形输出配置方式。 通过逻辑分析采集波形数据进行可视化显示对比。 【1】定时器PWM功能介绍 STM32F4 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达4路的PWM输出! 【2】PWM波形输出通道介绍 ** 定时器3的硬件PWM通道:PA6 PA7 PB0 PB1** 下面截图是介绍定时器3通道的复用IO口模式配置方式 【3】配置PWM波形输出代码示例 在工程中增加pwm.c文件,写入以下代码 #include pwm.h
[单片机]
STM32F407 基本<font color='red'>定时器</font>配置输出<font color='red'>PWM</font>方波
浅谈定时器基础知识与PWM输出原理
单片机开发中,电机的控制与定时器有着密不可分的关系,无论是直流电机,步进电机还是舵机,都会用到定时器,比如最常用的有刷直流电机,会使用定时器产生PWM波来调节转速,通过定时器的正交编码器接口来测量转速等。 本篇先介绍定时器的基础知识,然后对照这些知识介绍一下定时器输出PWM的基本原理,以及编程实现与代码分析。 首先来看一下定时器的基础介绍。 1 定时器基础知识 1.1 定时器种类 以STM32F4为例,一共有14个定时器: 高级定时器(TIM1、TIM8) 通用定时器(TIM2~TIM5,TIM9~TIM14) TIM2~TIM5(通用定时器里功能较多的) TIM9/TIM12 TIM10/TIM11和TIM13/TIM1
[单片机]
浅谈<font color='red'>定时器</font>基础知识与<font color='red'>PWM</font>输出原理
如何利用stm32的高级定时器产生PWM
用stm32的高级定时器TIM1和TIM8产生PWM,需要注意: 1.都有TIM1,但只有flash容量大于256K的大容量单片机才有TIM8 2.高级定时器相对于通用定时器,多了TIM_CtrlPWMOutputs(TIM8, ENABLE); TIM1产生四路PWM程序: staticvoidTIM1_GPIO_Config(void) { GPIO_InitTypeDefGPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
[单片机]
如何利用stm32的高级<font color='red'>定时器</font>产生<font color='red'>PWM</font>
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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