本人几年前开发个的一个基于STM32的无刷驱动板,当时试过,有霍尔,和利用反向电动势的无感启动都是可以的,也可以正常的带载运行。
后来因为切换到其他项目,没有再继续优化,
但程序的基本框架是正确的,编译也可完全通过。
发到网上供大家参考,有疑问的同行可以发帖相互交流学习,谢谢!
单片机源程序如下:
STM32单片机源程序如下:
- #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; //电机启动参数初始化,30ms,相当于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
- }
- //电机控制初始化函数
- void MotorCtr_ini(void)
- {
- MotorCtr.sample_ok=0; //电机采样参数初始化
- MotorCtr.motor_voltage=0;
- MotorCtr.motor_current=0;
-
- MotorCtr.speed_val=0; //电机速度参数初始化设定值
- 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; //电机转动控制初始化,顺时钟
- 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,开始计时间
- }
- 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,开始计时间
-
- }
- else if(Usart2Data.Usart_Rx_Cmd_L&MOTOR_STOP)
- {
- MotorCtr.motor_run_state=MOTOR_STOP;
- stop_motor();
- TIM_Cmd(TIM4, DISABLE); //使能TIM4,开始计时间
- }
- }
- 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(); //用于精确延时
-
- UART1_Initial(115200); //用于调试
- UART2_Initial(115200); //用于调试
-
- TIM2_Configuration(); //触发采样,用来设置ADC采样率
- MYDMA_Initial(); //ADC配置为DMA传输
- ADC_Initial(); //充电电流,电池电压AD输入初始化
-
- TIM4_Configuration(); //用于启动延时
-
- ISR_Initial(); //必须在所有任务开始运行后,开启中断初
-
- //TIM3_Configuration(); //霍尔输入触发配置
- //TIM1_Configuration(); //6路PWM产生配置,载波频率为25KHz
-
- MotorCtr_ini();
-
-
- Motor_Ctr();
- }
- void Motor_Ctr(void)
- {
- while(1)
- {
- MOTOR_CMD_process(); //运控板命令处理
-
- 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) //无感启动,或有霍尔传感器启动
- {
- MotorCtr.pwm_duty_set=FIXED_PHASE_PWM_DUTY; //max 1800
- Ctr_Process(MotorCtr.start_holl_value,MotorCtr.motor_dir); //转子预定位
- 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) //启动完毕速度,24步后,换向时间2.6ms,相当于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) //加速启动后再,固定速度启动几步
- MotorCtr.fixed_start_speed_cn++;
- else
- {
- #ifdef IO_INT_SENORLESS
- TIM_SetCounter(TIM3,0);
- #endif
-
- MotorCtr.motor_run_state = MOTOR_RUN;
- ADC1_sample(ENABLE); //理论上在启动中就要检测电流大小,进行保护,调试时跳过
- TIM_Cmd(TIM3, ENABLE);
- MotorCtr.start_step_cn=0;
- break;
- }
-
- }
-
- if(MotorCtr.Holzer_sensor) //有感启动,固定霍尔输入
- {
- 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 //无感启动,实时读取霍尔输入
- {
- 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对磁极对数)*60=转/min,换向延时 1000ms*60/转/2对磁极对数/6步,4000转时,每换向一次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); //转/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;
- }
- }
- }
复制代码
全部资料51hei下载地址:
Brushless_Drive_0303.7z
(360.09 KB, 下载次数: 699)
原理图.pdf
(45.46 KB, 下载次数: 671)
PCB图.pdf
(2.79 MB, 下载次数: 392)
|