心血来潮买了几个BLDC电机,准备这次就使用苹果派这块板子试一下BLDC电机的控制。
苹果派这块板子的书籍和例程很多,要驱动电机首先要配置定时器,产生可控的PWM脉冲。
趁快递还没到,先学习一下PWM的生成方式:
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以增快烧录速度
烧录完成后用示波器的探头连接PB10引脚,如图,可以看到清晰的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次阅读
GD32开发实战指南(基础篇) 第8章 定时器
Modulation” 的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的威廉希尔官方网站
。简单一点,就是对脉冲宽度的控制。 GD32 的定时器除了 TIMER5 和 6(基本
GD32E230C8T6高级定时器timer0无法正常输出PWM波形的原因?
原本想用高级定时器的中央对齐计数模式来输出SPWM波,但是TIMER0的CH0,CH1等口,都无法正常输出PWM波形,换成普通定时器就可以了,STM32里对于高级
发表于 07-26 06:34
GD电机驱动底层配置—永磁同步电机控制
,可使GD32F310系列广泛应用于永磁同步电机控制领域。本文将介绍应用于电机控制时,高级定时器和ADC的配置过程。 底层驱动配置
发表于 10-13 14:29
电机控制基础——定时器基础知识与PWM输出原理
单片机开发中,电机的控制与定时器有着密不可分的关系,无论是直流电机,步进电机还是舵机,都会用到定时器,比如最常用的有刷直流
发表于 11-30 14:21
•38次下载
GD32F303固件库开发(13)----定时器TIM捕获PWM测量频率与占空比
本章配置GD32F303输出PWM,同时使用TIM测量PWM频率和正占空比。 查阅手册可以得知,PB11为定时器1的通道3,让其输出
GD32103系列电机驱动项目总结
这次使用的GD系列的芯片来做电机的驱动。然后对使用GD芯片做个总结。这次做的是一个光伏机器人项目。主要用在光伏板上的机器人,通过驱动
发表于 03-17 16:21
•0次下载
利用通用定时器输出PWM(附示例驱动直流电机)
上一节讲述了时钟树和基本定时器的配置方法,本节先介绍通用定时器和基本定时器的差异,然后粗略讲述PWM波原理,然后讲述如何配置通用定时器,最后
发表于 04-03 14:56
•0次下载
评论