三相直流無刷電機驅動程序.doc
《三相直流無刷電機驅動程序.doc》由會員分享,可在線閱讀,更多相關《三相直流無刷電機驅動程序.doc(11頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1.檢測霍爾傳感器的值可以判斷出轉子的位置,再使能相應的上下橋臂,則能驅動電機運動;若要讓電機持續(xù)轉動,則必須再次檢測傳感器值及使能相應的上下橋臂。這里采用的是將霍爾傳感器輸出的三根線相邊的IO口配置成外部中斷,并且為邊沿觸發(fā),在中斷函數(shù)中加入傳感器檢測與上下橋臂切換程序,如此電機就能持續(xù)運轉了。 2.上橋臂的控制采用IO口置高低電平來控制上橋臂的通斷,下橋臂則使用單片機內部集成的三路PWM波來控制,通過控制PWM波的占空比,可以實現(xiàn)對電機的調速了。實際測得,占空比與電機的速度成正比例關系,在PWM波頻率為20KHz時,占空比增加1%,速度增加60rpm,并在占空比為53%時達到額定轉速3000rpm(空載)。 3.速度測量則采用如下公式: 電機每轉一圈,霍爾值改變6次x5個周期=30次,記錄邊沿觸發(fā)的中斷次數(shù)N/30=電機轉 過的圈數(shù),設運轉時間為t(s)則電機轉速v=N/30/t*60 rpm。即動轉時間為2s時,霍爾值改變次數(shù)即為速度值,單位rpm。 4.調速:給定速度,由電機驅動板自動由當前速度平滑過渡到給定速度。實際測試發(fā)現(xiàn),速度變化量很大時,電機會有突然加速或減速時的沖擊;因此,調速應有一個緩沖的過程。即加速或減速應以小步進緩慢增加或減少占空比來讓速度漸漸達到最終值。 #include "stm32f10x.h" #include "driver_motor.h" #define PWM_PERIOD_T 400 #define U_Up_On GPIOB->BSRR = GPIO_Pin_13 #define U_Up_Off GPIOB->BRR = GPIO_Pin_13 #define U_Dn_On GPIOA->BSRR = GPIO_Pin_8 #define U_Dn_Off GPIOA->BRR = GPIO_Pin_8 #define V_Up_On GPIOB->BSRR = GPIO_Pin_14 #define V_Up_Off GPIOB->BRR = GPIO_Pin_14 #define V_Dn_On GPIOA->BSRR = GPIO_Pin_9 #define V_Dn_Off GPIOA->BRR = GPIO_Pin_9 #define W_Up_On GPIOB->BSRR = GPIO_Pin_15 #define W_Up_Off GPIOB->BRR = GPIO_Pin_15 #define W_Dn_On GPIOA->BSRR = GPIO_Pin_10 #define W_Dn_Off GPIOA->BRR = GPIO_Pin_10 #define SU_HOR GPIOA->IDR & GPIO_Pin_15 #define SV_HOR GPIOA->IDR & GPIO_Pin_12 #define SW_HOR GPIOA->IDR & GPIO_Pin_11 //u8 Motor_Dir=0; //u8 Motor_EN=0; //u8 Hor_Value=7; //u16 TIM2_Conter=0; u16 Hall_Conter=0; MotorStruct Motor={CLOCK,40,STOP}; /******************************************************************************* * 函數(shù):void IO_Init(void) * 描述:IO * 參數(shù): * 返回: * 其它: *******************************************************************************/ void IO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; EXTI_InitTypeDef EXTI_InitStructure; //GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); /*使能SWD 禁用JTAG*/ /**********************LED Light***********/ GPIO_InitStruct.GPIO_Pin=GPIO_Pin_12; GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed=GPIO_Speed_2MHz; GPIO_Init(GPIOB, &GPIO_InitStruct); /***********************霍爾傳感器中斷**********/ GPIO_InitStruct.GPIO_Pin=GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_15; GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING; GPIO_InitStruct.GPIO_Speed=GPIO_Speed_2MHz; GPIO_Init(GPIOA, &GPIO_InitStruct);//Harl GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource11); GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource12); GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource15); EXTI_InitStructure.EXTI_Line = EXTI_Line11 | EXTI_Line12|EXTI_Line15; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); } /*************************************************************************** 函數(shù):void PWM_Init(void) 描述:配置PWM定時器TIM1 參數(shù): 返回:無 ***************************************************************************/ void PWM_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; TIM_OCInitTypeDef TIM_OCInitStructure; //TIM_BDTRInitTypeDef TIM_BDTRInitStructure; TIM_Cmd(TIM1 , DISABLE); TIM_CtrlPWMOutputs(TIM1, DISABLE);//禁止OC輸出 //IO口設置 GPIO_SetBits(GPIOA, GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10); //PWM口 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_SetBits(GPIOB, GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);//普通IO口 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); //定時器設置 TIM_TimeBaseInitStruct.TIM_Period = PWM_PERIOD_T;//5極電機,3000RPM,每個Step有10個脈沖,載波15KHZ TIM_TimeBaseInitStruct.TIM_Prescaler = 2; TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM1 , &TIM_TimeBaseInitStruct); //TIM_ClearITPendingBit(TIM1, TIM_IT_Update); //TIM_ARRPreloadConfig(TIM1, ENABLE); //TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE); //配置PWM輸出 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable; TIM_OCInitStructure.TIM_Pulse = 1; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low; TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set; TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Set; TIM_OC1Init(TIM1, &TIM_OCInitStructure); TIM_OC2Init(TIM1, &TIM_OCInitStructure); TIM_OC3Init(TIM1, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable); TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的預裝載寄存器 TIM_Cmd(TIM1 , ENABLE); TIM_Cmd(TIM1 , ENABLE); TIM_CtrlPWMOutputs(TIM1, ENABLE); } /***************************************************************************************** 函數(shù):void Motor_Init(void) 描述: 參數(shù): 返回: *****************************************************************************************/ void Motor_Init(void) { IO_Init(); PWM_Init(); } /***************************************************************************************** 函數(shù):void Flash_Led(u8 n) 描述: 參數(shù): 返回: *****************************************************************************************/ void Flash_Led(u8 n) { u8 i=0; for(i=0;i- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設計者僅對作品中獨創(chuàng)性部分享有著作權。
- 關 鍵 詞:
- 三相 直流 電機 驅動程序
裝配圖網(wǎng)所有資源均是用戶自行上傳分享,僅供網(wǎng)友學習交流,未經(jīng)上傳用戶書面授權,請勿作他用。
鏈接地址:http://www.szxfmmzy.com/p-6618307.html