|
本人幾年前開發(fā)個(gè)的一個(gè)基于STM32的無刷驅(qū)動(dòng)板,當(dāng)時(shí)試過,有霍爾,和利用反向電動(dòng)勢的無感啟動(dòng)都是可以的,也可以正常的帶載運(yùn)行。
后來因?yàn)榍袚Q到其他項(xiàng)目,沒有再繼續(xù)優(yōu)化,
但程序的基本框架是正確的,編譯也可完全通過。
發(fā)到網(wǎng)上供大家參考,有疑問的同行可以發(fā)帖相互交流學(xué)習(xí),謝謝!
單片機(jī)源程序如下:
cc0c55c0a1b4d5afe2d66acb8c0eca2.jpg (137.92 KB, 下載次數(shù): 131)
下載附件
2019-12-10 11:44 上傳
79989cce485b470289b957e3c1d6ded.jpg (80.45 KB, 下載次數(shù): 131)
下載附件
2019-12-10 11:44 上傳
13150583066a1080e0b95c04fd8647f.jpg (87.4 KB, 下載次數(shù): 94)
下載附件
2019-12-10 11:44 上傳
STM32單片機(jī)源程序如下:
- #include "includes.h"
- void Motor_Ctr(void);
- void send_wave_data(u16 send_data)
- {
- usart1_send_byte(0xAA);
- usart1_send_byte(send_data>>8);
- usart1_send_byte(send_data);
- }
- void Motor_start_param_initial()
- {
- MotorCtr.motor_start_delay=MAX_START_DELAY; //電機(jī)啟動(dòng)參數(shù)初始化,30ms,相當(dāng)于60000/6/2/30=166圈/分鐘
- MotorCtr.start_step_cn=0;
-
- #ifdef NO_HOLZER_SENSOR //無霍爾傳感器
-
- MotorCtr.Holzer_sensor=0;
- MotorCtr.No_Holzer_sensor_start_count=0;
- MotorCtr.start_holl_value=2;
- #else //有霍爾傳感器
-
- MotorCtr.Holzer_sensor=1;
- MotorCtr.Holzer_sensor_start_count=0;
- #endif
- }
- //電機(jī)控制初始化函數(shù)
- void MotorCtr_ini(void)
- {
- MotorCtr.sample_ok=0; //電機(jī)采樣參數(shù)初始化
- MotorCtr.motor_voltage=0;
- MotorCtr.motor_current=0;
-
- MotorCtr.speed_val=0; //電機(jī)速度參數(shù)初始化設(shè)定值
- MotorCtr.speed_set=0;
- MotorCtr.speed_time_cnt=0;
- MotorCtr.speed_time_ok=0;
-
- MotorCtr.holl_overtime_cnt=0;
- MotorCtr.holl_cnt=0;
- MotorCtr.sum_holl_time=0;
- MotorCtr.sample_ok_cn=0;
- MotorCtr.stall_time_cn=0;
-
- MotorCtr.motor_dir= NONE_DIR; //電機(jī)轉(zhuǎn)動(dòng)控制初始化,順時(shí)鐘
- MotorCtr.motor_run_state = MOTOR_IDLE;
-
- Motor_start_param_initial();
-
-
- MotorCtr.motor_run_state=MOTOR_START;
- MotorCtr.motor_dir= FORWARD_DIR;
- //MotorCtr.motor_dir= REVERSE_DIR;
- TIM_Cmd(TIM4, ENABLE); //使能TIM4,開始計(jì)時(shí)間
- }
- void MOTOR_CMD_process()
- {
- if(Usart2Data.Usart_Rx_Data_OK)
- {
-
- if(Usart2Data.Usart_Rx_Cmd_H==CMD_ORDER)
- {
- if(Usart2Data.Usart_Rx_Cmd_L&MOTOR_START)
- {
- Motor_start_param_initial();
- MotorCtr.motor_run_state=MOTOR_START;
- if(Usart2Data.Usart_Rx_Cmd_L&FORWARD_DIR)
- {
- MotorCtr.motor_dir= FORWARD_DIR;
- }
- if(Usart2Data.Usart_Rx_Cmd_L&REVERSE_DIR)
- {
- MotorCtr.motor_dir= REVERSE_DIR;
- }
- TIM_Cmd(TIM4, ENABLE); //使能TIM4,開始計(jì)時(shí)間
-
- }
- else if(Usart2Data.Usart_Rx_Cmd_L&MOTOR_STOP)
- {
- MotorCtr.motor_run_state=MOTOR_STOP;
- stop_motor();
- TIM_Cmd(TIM4, DISABLE); //使能TIM4,開始計(jì)時(shí)間
- }
- }
- else if(Usart2Data.Usart_Rx_Cmd_H==CMD_DATA_SPEED)
- {
- MotorCtr.pwm_duty_set=Usart2Data.Usart_Rx_Cmd_L*MIN_START_PWM_DUTY/SPEED_DUTY_NUM; //速度檔位1-10檔
- }
- else if(Usart2Data.Usart_Rx_Cmd_H==CMD_DATA_ANGLE)
- {
-
- }
-
- Usart2Data.Usart_Rx_Data_OK=0;
- }
- }
- int main(void)
- {
- RCC_Configuration();
- IO_Initial(); //初始化輸入輸出IO口及電平中斷輸入
- Delay_Initial(); //用于精確延時(shí)
-
- UART1_Initial(115200); //用于調(diào)試
- UART2_Initial(115200); //用于調(diào)試
-
- TIM2_Configuration(); //觸發(fā)采樣,用來設(shè)置ADC采樣率
- MYDMA_Initial(); //ADC配置為DMA傳輸
- ADC_Initial(); //充電電流,電池電壓AD輸入初始化
-
- TIM4_Configuration(); //用于啟動(dòng)延時(shí)
-
- ISR_Initial(); //必須在所有任務(wù)開始運(yùn)行后,開啟中斷初
-
- //TIM3_Configuration(); //霍爾輸入觸發(fā)配置
- //TIM1_Configuration(); //6路PWM產(chǎn)生配置,載波頻率為25KHz
-
- MotorCtr_ini();
-
-
- Motor_Ctr();
- }
- void Motor_Ctr(void)
- {
- while(1)
- {
- MOTOR_CMD_process(); //運(yùn)控板命令處理
-
- if(MotorCtr.sample_ok)
- {
- LED_ON=!LED_ON;
-
- MotorCtr.sample_ok=0;
-
- ADC1_Sample_filter(MotorCtr.sample_ok_cn);
-
- MotorCtr.motor_voltage+=single_motor_voltage[MotorCtr.sample_ok_cn];
- MotorCtr.motor_current+=single_motor_current[MotorCtr.sample_ok_cn];
-
- ADC1_sample(ENABLE);
-
- MotorCtr.sample_ok_cn++;
-
- if(MotorCtr.sample_ok_cn>=SAMPLE_OK_NUM)
- {
- MotorCtr.sample_ok_cn=0;
-
- MotorCtr.motor_voltage/=SAMPLE_OK_NUM;
- MotorCtr.motor_current/=SAMPLE_OK_NUM;
-
- if(MotorCtr.motor_voltage<BATTERY_MIN_V) //mA,最大可測1.2A
- {
-
- }
- if(MotorCtr.motor_current>MOTOR_STALL_A) //A
- {
-
- }
- printf("MotorCtr.motor_run_state %d\n",MotorCtr.motor_run_state);
-
- printf("MotorCtr.motor_voltage %d\n",MotorCtr.motor_voltage); //mV
- printf("MotorCtr.motor_current %d\n",MotorCtr.motor_current); //mA
- }
- }
-
- if(MotorCtr.motor_run_state==MOTOR_START) //無感啟動(dòng),或有霍爾傳感器啟動(dòng)
- {
- MotorCtr.pwm_duty_set=FIXED_PHASE_PWM_DUTY; //max 1800
- Ctr_Process(MotorCtr.start_holl_value,MotorCtr.motor_dir); //轉(zhuǎn)子預(yù)定位
- delay_ms(100);
- MotorCtr.start_holl_value=Manu_Ctr_Process(MotorCtr.start_holl_value,MotorCtr.motor_dir);
- Ctr_Process(MotorCtr.start_holl_value,MotorCtr.motor_dir); //二次定位
- delay_ms(100);
- MotorCtr.pwm_duty_set=MIN_START_PWM_DUTY; //max 1800
- MotorCtr.fixed_start_speed_cn=0;
- while(1)
- {
- MotorCtr.start_step_cn++;
-
- Ctr_Process(MotorCtr.start_holl_value,MotorCtr.motor_dir); //控制與換相
-
- if(MotorCtr.start_step_cn<=MAX_START_STEP_NUM) //啟動(dòng)完畢速度,24步后,換向時(shí)間2.6ms,相當(dāng)于60000/6/2/2.6=1923圈/分鐘
- {
- MotorCtr.motor_start_delay=MotorCtr.motor_start_delay*STEP_PWM_DELAY;
- }
- else
- {
-
- if(MotorCtr.fixed_start_speed_cn<FIXED_SPEED_START_NUM) //加速啟動(dòng)后再,固定速度啟動(dòng)幾步
- MotorCtr.fixed_start_speed_cn++;
- else
- {
- #ifdef IO_INT_SENORLESS
- TIM_SetCounter(TIM3,0);
- #endif
-
- MotorCtr.motor_run_state = MOTOR_RUN;
- ADC1_sample(ENABLE); //理論上在啟動(dòng)中就要檢測電流大小,進(jìn)行保護(hù),調(diào)試時(shí)跳過
- TIM_Cmd(TIM3, ENABLE);
- MotorCtr.start_step_cn=0;
- break;
- }
-
- }
-
- if(MotorCtr.Holzer_sensor) //有感啟動(dòng),固定霍爾輸入
- {
- MotorCtr.start_holl_value =0;
- MotorCtr.start_holl_value = FHASE_C_IN<<2 | FHASE_B_IN<<1 | FHASE_A_IN<<0;
-
- if(MotorCtr.Holzer_sensor_start_count<MAX_MOTOR_START_NUM)
- MotorCtr.Holzer_sensor_start_count++;
- else
- {
- MotorCtr.motor_run_state =MOTOR_STALL;
- motor_brake();
- }
- }
- else //無感啟動(dòng),實(shí)時(shí)讀取霍爾輸入
- {
- MotorCtr.start_holl_value=Manu_Ctr_Process(MotorCtr.start_holl_value,MotorCtr.motor_dir);
- /*
- if(MotorCtr.No_Holzer_sensor_start_count<MAX_MOTOR_START_NUM)
- MotorCtr.No_Holzer_sensor_start_count++;
- else
- {
- MotorCtr.motor_run_state =MOTOR_STALL;
- motor_brake();
- }*/
- }
- delay_us(MotorCtr.motor_start_delay);
-
- }
- }
- else if(MotorCtr.motor_run_state == MOTOR_RUN)
- {
- if(MotorCtr.speed_time_ok)
- {
- MotorCtr.speed_time_ok=0;
- MotorCtr.speed_val=MotorCtr.holl_cnt*SPEED_K; //(MotorCtr.holl_cnt/6步/2對磁極對數(shù))*60=轉(zhuǎn)/min,換向延時(shí) 1000ms*60/轉(zhuǎn)/2對磁極對數(shù)/6步,4000轉(zhuǎn)時(shí),每換向一次1.25ms
-
- MotorCtr.ave_holl_time=HOLL_SPEED_K/(MotorCtr.sum_holl_time/MotorCtr.holl_cnt);
-
- send_wave_data(MotorCtr.speed_val);
-
- printf("MotorCtr.speed_val %d\n",MotorCtr.speed_val); //轉(zhuǎn)/min
- printf("MotorCtr.ave_holl_time %d\n",MotorCtr.ave_holl_time);
- //printf("MotorCtr.holl_overtime_cnt %d\n",MotorCtr.holl_overtime_cnt);
- printf("MotorCtr.pwm_duty_set %d\n",MotorCtr.pwm_duty_set);
-
- MotorCtr.sum_holl_time=0;
- MotorCtr.holl_cnt=0;
-
- }
- }
- else //MOTOR_STOP
- {
- MotorCtr.speed_val=0;
- MotorCtr.holl_overtime_cnt = 0;
- MotorCtr.sum_holl_time=0;
- MotorCtr.holl_cnt=0;
- }
- }
- }
復(fù)制代碼
全部資料51hei下載地址:
Brushless_Drive_0303.7z
(360.09 KB, 下載次數(shù): 699)
2019-12-10 13:58 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
原理圖.pdf
(45.46 KB, 下載次數(shù): 671)
2019-12-10 11:45 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
PCB圖.pdf
(2.79 MB, 下載次數(shù): 392)
2019-12-10 11:44 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|