赞
踩
本農之前看過一些教程,按照他們的方法都沒有成功啓動motor,最後用示波器分析出原因,最終解決了問題
示波器中所示的波形就是測試儀(藍盒子)所輸出的pwm波形,頻率為50hz,占空比為4.5%,按照下面公式計算,
參數應該按照如下設置
htim->Init.Prescaler = 72-1;
htim->Init.Period = 20000-1;
意思就是在基礎頻率72Mhz的條件下,
72Mhz/72/20000 = 50hz
然後CCR的值
CCR/20000 = 4.5%
CCR = 900
按照計算出的參數 在電機接上電源后,應立即設置CCR值,初始化電機,但是實際沒有成功
__HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_2, 900); //music, then bb, then b..... long volume
示波器顯示如下,很明顯,基礎頻率怎麽才這麽點?
在程序中獲取當前時鐘頻率
uint32_t sysClockFreq = HAL_RCC_GetSysClockFreq();
USART_SendFormatString("sysClockFreq: %d\r\n", sysClockFreq);
結果顯示:
sysClockFreq: 8000000
原來如此,更改prescaler
htim->Init.Prescaler = 8-1;
extern TIM_HandleTypeDef htim2; void pwm_msc_init(TIM_HandleTypeDef* htim){ zssLogINFO("<%s %d> %s(arg: %s)", __FILE__, __LINE__, __FUNCTION__, "LOG_IN"); HAL_TIM_PWM_Start(htim,TIM_CHANNEL_2); //enable PWM __HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_2, 900); //music, then bb, then b..... long volume USART_SendFormatString("please insert vcc line\r\n"); HAL_Delay(3000 * 100); zssLogINFO("<%s %d> %s(arg: %s)", __FILE__, __LINE__, __FUNCTION__, "LOG_OUT"); } void pwm_msc_start(TIM_HandleTypeDef* htim){ // Implementation goes here zssLogINFO("<%s %d> %s(arg: %s)", __FILE__, __LINE__, __FUNCTION__, "LOG_IN"); __HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_2,1000); //motor begin rotate HAL_Delay(3000 * 100); zssLogINFO("<%s %d> %s(arg: %s)", __FILE__, __LINE__, __FUNCTION__, "LOG_OUT"); }
uint32_t sysClockFreq = HAL_RCC_GetSysClockFreq();
教程中說需要先將油門加到最大,聽到bb聲后,再調到最小, 我發現不用那麽麻煩,直接調到最小,然後在3s内接上電源即可解鎖
好多教程說是設置最小1000,最大2000,其實我感覺這個是不確定的,我試過我的ESC電調1000是無法初始化成功的,最正規的方式是看示波器數據,然後手動計算出初始值.
CCR/20000 = 4.5%
CCR = 900
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。