歡迎來到裝配圖網(wǎng)! | 幫助中心 裝配圖網(wǎng)zhuangpeitu.com!
裝配圖網(wǎng)
ImageVerifierCode 換一換
首頁 裝配圖網(wǎng) > 資源分類 > DOC文檔下載  

三相直流無刷電機驅(qū)動程序.doc

  • 資源ID:6618307       資源大?。?span id="b0rtwu5" class="font-tahoma">44KB        全文頁數(shù):11頁
  • 資源格式: DOC        下載積分:9.9積分
快捷下載 游客一鍵下載
會員登錄下載
微信登錄下載
三方登錄下載: 微信開放平臺登錄 支付寶登錄   QQ登錄   微博登錄  
二維碼
微信掃一掃登錄
下載資源需要9.9積分
郵箱/手機:
溫馨提示:
用戶名和密碼都是您填寫的郵箱或者手機號,方便查詢和重復下載(系統(tǒng)自動生成)
支付方式: 支付寶    微信支付   
驗證碼:   換一換

 
賬號:
密碼:
驗證碼:   換一換
  忘記密碼?
    
友情提示
2、PDF文件下載后,可能會被瀏覽器默認打開,此種情況可以點擊瀏覽器菜單,保存網(wǎng)頁到桌面,就可以正常下載了。
3、本站不支持迅雷下載,請使用電腦自帶的IE瀏覽器,或者360瀏覽器、谷歌瀏覽器下載即可。
4、本站資源下載后的文檔和圖紙-無水印,預覽文檔經(jīng)過壓縮,下載后原文更清晰。
5、試題試卷類文檔,如果標題沒有明確說明有答案則都視為沒有答案,請知曉。

三相直流無刷電機驅(qū)動程序.doc

1.檢測霍爾傳感器的值可以判斷出轉(zhuǎn)子的位置,再使能相應的上下橋臂,則能驅(qū)動電機運動;若要讓電機持續(xù)轉(zhuǎn)動,則必須再次檢測傳感器值及使能相應的上下橋臂。這里采用的是將霍爾傳感器輸出的三根線相邊的IO口配置成外部中斷,并且為邊沿觸發(fā),在中斷函數(shù)中加入傳感器檢測與上下橋臂切換程序,如此電機就能持續(xù)運轉(zhuǎn)了。2.上橋臂的控制采用IO口置高低電平來控制上橋臂的通斷,下橋臂則使用單片機內(nèi)部集成的三路PWM波來控制,通過控制PWM波的占空比,可以實現(xiàn)對電機的調(diào)速了。實際測得,占空比與電機的速度成正比例關系,在PWM波頻率為20KHz時,占空比增加1%,速度增加60rpm,并在占空比為53%時達到額定轉(zhuǎn)速3000rpm(空載)。3.速度測量則采用如下公式:電機每轉(zhuǎn)一圈,霍爾值改變6次x5個周期=30次,記錄邊沿觸發(fā)的中斷次數(shù)N/30=電機轉(zhuǎn) 過的圈數(shù),設運轉(zhuǎn)時間為t(s)則電機轉(zhuǎn)速v=N/30/t*60 rpm。即動轉(zhuǎn)時間為2s時,霍爾值改變次數(shù)即為速度值,單位rpm。4.調(diào)速:給定速度,由電機驅(qū)動板自動由當前速度平滑過渡到給定速度。實際測試發(fā)現(xiàn),速度變化量很大時,電機會有突然加速或減速時的沖擊;因此,調(diào)速應有一個緩沖的過程。即加速或減速應以小步進緩慢增加或減少占空比來讓速度漸漸達到最終值。#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<n;i+) Led_On; DelayMs(100*n); Led_Off; DelayMs(100*n); /*函數(shù):void SetPWMduty(u8 PWMChanel,u16 pulse)描述:設置pwm波占空比參數(shù):返回:*/void SetPWMduty(u8 PWMChanel,u16 pulse) switch(PWMChanel) case 1 : TIM1->CCR1=pulse; break; case 2 : TIM1->CCR2=pulse; break; case 3 : TIM1->CCR3=pulse; break; default : break; /*函數(shù):PWM_T_Output描述:設置相應的PWM梯形波輸出參數(shù):pName上橋臂名稱,nName下橋臂名稱返回:無*/void PWM_T_Output(u8 pName , u8 nName , u8 mRate) switch(pName) case 1: GPIO_SetBits(GPIOB, GPIO_Pin_15 | GPIO_Pin_14 ); GPIO_ResetBits(GPIOB , GPIO_Pin_13); break; case 2: GPIO_SetBits(GPIOB, GPIO_Pin_13 | GPIO_Pin_15 ); GPIO_ResetBits(GPIOB , GPIO_Pin_14); break; case 3: GPIO_SetBits(GPIOB, GPIO_Pin_13 | GPIO_Pin_14 ); GPIO_ResetBits(GPIOB , GPIO_Pin_15); break; default: GPIO_SetBits(GPIOB, GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15); switch(nName) case 1: TIM_SetCompare2(TIM1,0); TIM_SetCompare3(TIM1,0); TIM_SetCompare1(TIM1,(u16)(PWM_PERIOD_T * mRate / 100); break; case 2: TIM_SetCompare3(TIM1,0); TIM_SetCompare1(TIM1,0); TIM_SetCompare2(TIM1,(u16)(PWM_PERIOD_T * mRate / 100); break; case 3: TIM_SetCompare2(TIM1,0); TIM_SetCompare1(TIM1,0); TIM_SetCompare3(TIM1,(u16)(PWM_PERIOD_T * mRate / 100); break; default: TIM_SetCompare1(TIM1,0); TIM_SetCompare2(TIM1,0); TIM_SetCompare3(TIM1,0); TIM_SetAutoreload(TIM1, PWM_PERIOD_T);/*函數(shù):PWM_T_Calculation描述:梯形波計算參數(shù):HallValue霍爾值,mRate調(diào)制百分比,direction方向返回:無*/void PWM_T_Calculation(u8 hallValue , u8 mRate , u8 direction) if(direction = 1) switch(hallValue) case 5: PWM_T_Output(1 , 3 , mRate); break; case 1: PWM_T_Output(1 , 2 , mRate); break; case 3: PWM_T_Output(3 , 2 , mRate); break; case 2: PWM_T_Output(3 , 1 , mRate); break; case 6: PWM_T_Output(2 , 1 , mRate); break; case 4: PWM_T_Output(2 , 3 , mRate); break; default: PWM_T_Output(4 , 4 , 0); break; else switch(hallValue) case 5: PWM_T_Output(3 , 1 , mRate); break; case 1: PWM_T_Output(2 , 1 , mRate); break; case 3: PWM_T_Output(2 , 3 , mRate); break; case 2: PWM_T_Output(1 , 3 , mRate); break; case 6: PWM_T_Output(1 , 2 , mRate); break; case 4: PWM_T_Output(3 , 2 , mRate); break; default: PWM_T_Output(4 , 4 , 0); break; /*函數(shù):PWM_T_Int描述:定時器中斷程序,根據(jù)霍爾位置設置輸出梯形波參數(shù):direction=順時針/逆時針,mRate調(diào)制率返回:無*/void PWM_T_Int(u8 direction , u8 mRate) u8 hallValueTemp; u8 hallValue; hallValueTemp = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_11) + (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12) << 1) + (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_15) << 2); hallValue = hallValueTemp; PWM_T_Calculation(hallValue , mRate , direction);/*函數(shù):PWM_Stop描述:PWM控制信號使能輸出,禁止TIM1中斷,使能TIM1中斷參數(shù):pwmflag=DISABLE,PWM信號使能輸出,pwmflag=ENABLE,禁止 PWM輸出返回:無*/void PWM_Stop(u8 pwmflag) NVIC_InitTypeDef NVIC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; if(pwmflag = ENABLE)/禁止 PWM輸出 TIM_Cmd(TIM1 , DISABLE); /TIM_Cmd(TIM2 , DISABLE); NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_TIM16_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE; NVIC_Init(&NVIC_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_SetBits(GPIOA, GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10); /PWM口 /PWM_T_Output(4 , 4 , 0); if(pwmflag = DISABLE)/使能PWM輸出 NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_TIM16_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; GPIO_Init(GPIOA, &GPIO_InitStructure); / TIM_Cmd(TIM2 , ENABLE); /*函數(shù):void Motor_Start(void)描述:啟動電機參數(shù):返回:*/void Motor_Start(void) PWM_T_Int(Motor.Dir,Motor.Speed);/*函數(shù):void Motor_Stop(void)描述:停止參數(shù):返回:*/void Motor_Stop(void) /U_Up_On;V_Up_On;W_Up_On; /U_Dn_On;V_Dn_On;W_Dn_On; PWM_T_Output(4,4,0);/*函數(shù):void EXTI15_10_IRQHandler(u8 dir,u8 hall)描述:霍爾傳感器中斷參數(shù):返回:*/void EXTI15_10_IRQHandler(void) Hall_Conter+; if (EXTI_GetITStatus(EXTI_Line11) != RESET)|(EXTI_GetITStatus(EXTI_Line12) != RESET)|(EXTI_GetITStatus(EXTI_Line15) != RESET) if(Motor.State!=STOP) PWM_T_Int(Motor.Dir,Motor.Speed); EXTI_ClearITPendingBit(EXTI_Line11); /清除標志 EXTI_ClearITPendingBit(EXTI_Line12); /清除標志 EXTI_ClearITPendingBit(EXTI_Line15); /清除標志/*函數(shù):void Test_Motor(u8 dir,u8 hall)描述:電機控制參數(shù):返回:*/void Test_Motor(void) while(1) switch(Motor.State) case STOP : Motor_Stop(); break; case RUN : Motor_Start(); Motor.State=FREE; break; default : break;

注意事項

本文(三相直流無刷電機驅(qū)動程序.doc)為本站會員(w****2)主動上傳,裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。 若此文所含內(nèi)容侵犯了您的版權或隱私,請立即通知裝配圖網(wǎng)(點擊聯(lián)系客服),我們立即給予刪除!

溫馨提示:如果因為網(wǎng)速或其他原因下載失敗請重新下載,重復下載不扣分。




關于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!