心血來潮買了幾個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文章
5193瀏覽量
214256 -
定時器
+關注
關注
23文章
3251瀏覽量
115033 -
FreeRTOS
+關注
關注
12文章
484瀏覽量
62230 -
BLDC電機
+關注
關注
7文章
213瀏覽量
21572 -
gd32f303
+關注
關注
4文章
38瀏覽量
3699
發布評論請先 登錄
相關推薦
基于GD32 MCU的電機驅動方案詳解
兆易創新 GD32 MCU 在電機驅動應用上,經過多年技術沉淀,在無刷電機和步進電機的應用中,形成自身完整可靠的解決方案,愿能為用戶提供更多
發表于 07-03 16:43
?7581次閱讀
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次下載
評論