01測試介紹
測試硬件:
IHM16M1 +NUCLEO-G431RB 電機套件
SSD1306 OLED IIC接口顯示屏·
EC1 旋轉編碼器
RED LED 燈
ZD2808-V1.9 BLDC 電機
杜邦線+萬用板+Type-C連接線
12V 1A開關電源
測試使用EC1旋轉編碼器調節電機的目標轉速,使用開發板user1按鈕啟動/停止電機。OLED顯示電機轉速和調節轉速設置,LED指示電機狀態
02開發板資源分配
SSD1306 OLED使用 I2C1 接口,引腳 PB9 =>SDA ,PB8 => SCL
EC1旋轉編碼器 使用 TIM3定時器 ,引腳 PC6 => TIM3_CH1,PC7 => TIM3_CH2
RED LED ,引腳 PB7 => LED
03程序設置與引腳分配
1、旋轉編碼設置
EC1旋轉編碼器,使用TIM3定時器,模式設置為:ENCoder MODE,引腳PC6 => EC1_CLK, PC7 => EC1_DT
輸入過濾值選擇:15,其它默認。如果EC1旋轉時跳動厲害,可以降低TIM3預分頻器。
2、SSD1306 128*64 OLED
OLED使用I2C1作為控制,引腳PB9 =>OLED_SDA ,PB8 => OLED_SCL
3、RED LED
LED使用GPIO PB8引腳,將引腳設置上拉和輸出模式。
04程序與工作原理
1、EC1是一種簡易的旋轉編碼器,可以生產兩路脈沖CLK、DT,該組脈沖相差90度,編碼器作為機械部件其輸出的波形不如磁編的好,所以輸出引腳需要上拉電阻和103的電容濾波。
編碼器可以使用__HAL_TIM_GET_COUNTER(&htim3)獲得編碼的計數累加值。__HAL_TIM_SetCounter(&htim3,0);設置編碼器的初始值。
向上滑動閱覽
/* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_DMA_Init(); MX_ADC1_Init(); MX_ADC2_Init(); MX_CORDIC_Init(); MX_TIM1_Init(); MX_USART2_UART_Init(); MX_MotorControl_Init(); MX_I2C1_Init(); MX_TIM3_Init(); /* Initialize interrupts */ MX_NVIC_Init(); /* USER CODE BEGIN 2 */ rspeed = MC_GetMecSpeedReferenceMotor1(); HAL_TIM_Encoder_Start(&htim3,TIM_CHANNEL_ALL); ssd1306_Init(); ssd1306_Fill(Black); ssd1306_SetCursor(0, 0); ssd1306_WriteString("EEWORLD", Font_11x18, White); ssd1306_UpdateScreen(); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { if (IDLE == MC_GetSTMStateMotor1()) { /* Ramp parameters should be tuned for the actual motor */ HAL_GPIO_WritePin(Mstatus_GPIO_Port,Mstatus_Pin,GPIO_PIN_RESET); speed = 0; counter = __HAL_TIM_GET_COUNTER(&htim3); if(counter != counter_old) { //rspeed = MC_GetMecSpeedReferenceMotor1(); rspeed += counter/2; if( rspeed <0) { rspeed=0; __HAL_TIM_SetCounter(&htim3,0); } if( rspeed > 420) { rspeed=420; __HAL_TIM_SetCounter(&htim3,0); } MC_ProgramSpeedRampMotor1(rspeed, 1000); } counter_old = counter; } else { HAL_GPIO_WritePin(Mstatus_GPIO_Port,Mstatus_Pin,GPIO_PIN_SET); speed = MC_GetMecSpeedAverageMotor1(); } ssd1306_Fill(Black); ssd1306_SetCursor(0, 0); ssd1306_WriteString("SPEED TEST", Font_11x18, White); ssd1306_SetCursor(0, 20); memset(MessageStr,'?',sizeof(MessageStr)); sprintf(MessageStr,"%d RPM",speed * 6); ssd1306_WriteString(MessageStr, Font_11x18, White); ssd1306_SetCursor(0, 40); memset(MessageStr,'?',sizeof(MessageStr)); sprintf(MessageStr,"%d R",rspeed * 6); ssd1306_WriteString(MessageStr, Font_11x18, White); ssd1306_UpdateScreen(); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ }
2、電機的狀態使用MC_GetSTMStateMotor1()函數返回,IDLE狀態為電機停止且準備好狀態,在該狀態下可以調節參數和設置電機啟動。本例將電機參數設置放在該狀態下完成。
向上滑動閱覽
if (IDLE == MC_GetSTMStateMotor1()) { /* Ramp parameters should be tuned for the actual motor */ HAL_GPIO_WritePin(Mstatus_GPIO_Port,Mstatus_Pin,GPIO_PIN_RESET); speed = 0; counter = __HAL_TIM_GET_COUNTER(&htim3); if(counter != counter_old) { //rspeed = MC_GetMecSpeedReferenceMotor1(); rspeed += counter/2; if( rspeed <0) ? ? ? ? { ? ? ? ? ? rspeed=0; ? ? ? ? ? __HAL_TIM_SetCounter(&htim3,0); ? ? ? ? } ? ? ? ? if( rspeed > 420) { rspeed=420; __HAL_TIM_SetCounter(&htim3,0); } MC_ProgramSpeedRampMotor1(rspeed, 1000); } counter_old = counter; } else { HAL_GPIO_WritePin(Mstatus_GPIO_Port,Mstatus_Pin,GPIO_PIN_SET); speed = MC_GetMecSpeedAverageMotor1(); }
參數設置:MC_ProgramSpeedRampMotor1(rspeed, 1000);該函數可以設置從上一個狀態到目標狀態需要持續的時間,其時間斜率需要根據電機的性能參數而定。
05測試
修改轉速過程,使用旋轉編碼器進行參數的調節,順時針:增加轉速,逆時針:降低轉速
以上測評內容撰寫自電子工程世界(EEWORLD)用戶:bigbat。感謝這位小伙伴對測評活動的大力支持!
-
OLED
+關注
關注
119文章
6270瀏覽量
227119 -
編碼器
+關注
關注
45文章
3773瀏覽量
137118 -
電機
+關注
關注
143文章
9248瀏覽量
148327 -
開發板
+關注
關注
25文章
5503瀏覽量
102196
原文標題:【測評分享】IHM16M1開發板電機調速攻略
文章出處:【微信號:易絡盟電子,微信公眾號:易絡盟電子】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
評論