0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

冬至子 来源:极术社区 作者:电子烂人 2023-12-13 15:20 次阅读

心血来潮买了几个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
1702377055707.png

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

微信图片_20231212183455.jpg

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • PWM
    PWM
    +关注

    关注

    114

    文章

    5186

    浏览量

    213975
  • 定时器
    +关注

    关注

    23

    文章

    3248

    浏览量

    114833
  • FreeRTOS
    +关注

    关注

    12

    文章

    484

    浏览量

    62184
  • BLDC电机
    +关注

    关注

    7

    文章

    211

    浏览量

    21490
  • gd32f303
    +关注

    关注

    4

    文章

    38

    浏览量

    3693
收藏 人收藏

    评论

    相关推荐

    基于GD32 MCU的电机驱动方案详解

    兆易创新 GD32 MCU 在电机驱动应用上,经过多年威廉希尔官方网站 沉淀,在无刷电机和步进电机的应用中,形成自身完整可靠的解决方案,愿能为用户提供更多
    发表于 07-03 16:43 7542次阅读

    电机控制基础知识1定时器基础知识与PWM输出原理

    单片机开发中,电机的控制与定时器有着密不可分的关系,无论是直流电机,步进电机还是舵机,都会用到定时器,比如最常用的有刷直流
    的头像 发表于 06-17 00:11 1.2w次阅读
    <b class='flag-5'>电机</b>控制基础知识<b class='flag-5'>1</b>—<b class='flag-5'>定时器</b>基础知识与<b class='flag-5'>PWM</b>输出原理

    GD32对Timer定时器原理的详细讲解

    GD32 Timr定时器看起来比较复杂啊。一看GD32E10x 的SPEC:一个高级定时器,三个通用定时器,还有一个基本
    的头像 发表于 04-22 17:02 1.7w次阅读
    <b class='flag-5'>GD32</b>对Timer<b class='flag-5'>定时器</b>原理的详细讲解

    STM32F103定时器PWM驱动步进电机加减速

    之前学习了定时器的一些基本知识,实现了1ms的定时,本次学习定时器PWM功能,用定时器产生的
    的头像 发表于 02-28 14:25 6.5w次阅读
    STM32F103<b class='flag-5'>定时器</b><b class='flag-5'>PWM</b><b class='flag-5'>驱动</b>步进<b class='flag-5'>电机</b>加减速

    GD32开发实战指南(基础篇) 第7章 定时器

    系统滴答定时器一般用来提供“心跳”作用,而GD32定时器最基本功能也是定时,可以设置不同时间长度的定时
    的头像 发表于 05-11 09:00 1.2w次阅读
    <b class='flag-5'>GD32</b>开发实战指南(基础篇) 第7章 <b class='flag-5'>定时器</b>

    GD32开发实战指南(基础篇) 第8章 定时器

    Modulation” 的缩写,简称脉宽调制,是利用微处理的数字输出来对模拟电路进行控制的一种非常有效的威廉希尔官方网站 。简单一点,就是对脉冲宽度的控制。 GD32定时器除了 TIMER5 和 6(基本
    的头像 发表于 05-12 22:14 7970次阅读
    <b class='flag-5'>GD32</b>开发实战指南(基础篇) 第8章 <b class='flag-5'>定时器</b>

    GD32E230C8T6高级定时器timer0无法正常输出PWM波形的原因?

    原本想用高级定时器的中央对齐计数模式来输出SPWM波,但是TIMER0的CH0,CH1等口,都无法正常输出PWM波形,换成普通定时器就可以了,STM32里对于高级
    发表于 07-26 06:34

    GD电机驱动底层配置—永磁同步电机控制

    ,可使GD32F310系列广泛应用于永磁同步电机控制领域。本文将介绍应用于电机控制时,高级定时器和ADC的配置过程。  底层驱动配置  
    发表于 10-13 14:29

    GD32-Colibri-F207实验板定时器1停止

    GD32-Colibri-F207实验板定时器1停止,很好的GD32资料,快来学习吧。
    发表于 04-21 14:24 11次下载

    电机控制基础——定时器基础知识与PWM输出原理

    单片机开发中,电机的控制与定时器有着密不可分的关系,无论是直流电机,步进电机还是舵机,都会用到定时器,比如最常用的有刷直流
    发表于 11-30 14:21 38次下载
    <b class='flag-5'>电机</b>控制基础——<b class='flag-5'>定时器</b>基础知识与<b class='flag-5'>PWM</b>输出原理

    普通定时器输出互补PWM带死区

    无刷电机。这下就需要用到互补PWM了。然后选型的单片机只有一路高级定时器tim1,另外一个电机PWM
    发表于 12-16 16:59 24次下载
    普通<b class='flag-5'>定时器</b>输出互补<b class='flag-5'>PWM</b>带死区

    GD32F303固件库开发(13)----定时器TIM捕获PWM测量频率与占空比

    本章配置GD32F303输出PWM,同时使用TIM测量PWM频率和正占空比。 查阅手册可以得知,PB11为定时器1的通道3,让其输出
    的头像 发表于 12-07 10:19 6106次阅读
    <b class='flag-5'>GD</b>32F303固件库开发(13)----<b class='flag-5'>定时器</b>TIM捕获<b class='flag-5'>PWM</b>测量频率与占空比

    GD32103系列电机驱动项目总结

    这次使用的GD系列的芯片来做电机驱动。然后对使用GD芯片做个总结。这次做的是一个光伏机器人项目。主要用在光伏板上的机器人,通过驱动
    发表于 03-17 16:21 0次下载
    <b class='flag-5'>GD</b>32103系列<b class='flag-5'>电机</b><b class='flag-5'>驱动</b>项目总结

    利用通用定时器输出PWM(附示例驱动直流电机)

    上一节讲述了时钟树和基本定时器的配置方法,本节先介绍通用定时器和基本定时器的差异,然后粗略讲述PWM波原理,然后讲述如何配置通用定时器,最后
    发表于 04-03 14:56 0次下载
    利用通用<b class='flag-5'>定时器</b>输出<b class='flag-5'>PWM</b>(附示例<b class='flag-5'>驱动</b>直流<b class='flag-5'>电机</b>)

    GD32 Timer定时器周期时间计算公式

    有小伙伴反馈GD32 Timer定时器的周期时间不知如何计算,今天就来安排。
    的头像 发表于 01-22 09:53 2720次阅读
    <b class='flag-5'>GD32</b> Timer<b class='flag-5'>定时器</b>周期时间计算公式