PWM生成原理:
通用定時器可以利用GPIO引腳進行脈沖輸出,在配置為比較輸出、PWM輸出功能時,捕獲/比較寄存器通用定時器可以利用GPIO引腳進行脈沖輸出,在配置為比較輸出、PWM輸出功能時,捕獲/比較寄存器TIMx_CCR被用作比較功能,下面把它簡稱為比較寄存器。 這里直接舉例說明定時器的PWM輸出工作過程:若配置脈沖計數器TIMx_CNT為向上計數,而重載寄存器TIMx_ARR被配置為N,即TIMx_CNT的當前計數值數值X在TIMxCLK時鐘源的驅動下不斷累加,當TIMx_CNT的數值X大于N時,會重置TIMx_CNT數值為0重新計數。 而在TIMxCNT計數的同時,TIMxCNT的計數值X會與比較寄存器TIMx_CCR預先存儲了的數值A進行比較,當脈沖計數器TIMx_CNT的數值X小于比較寄存器TIMx_CCR的值A時,輸出高電平(或低電平),相反地,當脈沖計數器的數值X大于或等于比較寄存器的值A時,輸出低電平(或高電平)。 如此循環,得到的輸出脈沖周期就為重載寄存器TIMx_ARR存儲的數值(N+1)乘以觸發脈沖的時鐘周期,其脈沖寬度則為比較寄存器TIMx_CCR的值A乘以觸發脈沖的時鐘周期,即輸出PWM的占空比為 A/(N+1) 。
STM32產生PWM的配置方法:
1、配置GPIO口:
配置IO口的時候無非就是開啟時鐘,然后選擇引腳、模式、速率,最后就是用結構體初始化。不過在32上,不是每一個IO引腳都可以直接使用于PWM輸出,因為在硬件上已經規定了用某些引腳來連接PWM的輸出口。下面是定時器的引腳重映像,其實就是引腳的復用功能選擇:
a.定時器1/8的引腳配置及復用功能映像:
根據以上重映像表,我們使用定時器1的通道TIM1__CH2作為PWM的輸出通道,若選擇PA9引腳則應進行配置,如下:
{
GPIO_InitTypeDef GPIO_InitStructure;//定義結構體
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
//使能 GPIO外設和AFIO復用功能模塊時鐘
//GPIO_PinRemapConfig(GPIO_FullRemap_TIM1, ENABLE); //選擇Tim1完全重映像,即用了 PE11
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //TIM_CH2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化引腳
}
產生六路PWM互補輸出的GPIO配置:
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO |RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10; //PA8、9、10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; //PB13、14、15
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
產生六路PWM互補輸出的TIM1設置:
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//定義時基結構體
TIM_OCInitTypeDef TIM_OCInitStructure;//定義輸出結構體
TIM1_BDTRInitTypeDef TIM1_BDTRInitStructure; //定義死區結構體
RCC_APB2PeriphClockCmd(RCC_APB1Periph_TIM1, ENABLE); //使能定時器1時鐘
TIM_TimeBaseStructure.TIM_Period = arr; //自動重裝載寄存器ARR的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //TIM1預分頻器PSC的值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //時鐘分割,不分頻
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上計數
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根據以上功能對定時器進行初始化
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //選擇定時器模式,TIM脈沖寬度調制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
TIM_OCInitStructure.TIM_OutputState = TIM_OutputNState_Enable; //互補端輸出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //輸出比較極性
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low; //輸出互補端極性
//TIM1_OCInitStructure.TIM1_OCIdleState = TIM1_OCIdleState_Reset; //死區后輸出狀態
//TIM1_OCInitStructure.TIM1_OCNIdleState = TIM1_OCIdleState_Reset; //死區后互補端輸出狀態
TIM_OCInitStructure.TIM_Pulse = ccr1; //設置通道CH1/CH1N占空比
TIM_OC1Init(TIM1, &TIM_OCInitStructure); //通道CH1/CH1N初始化
TIM_OCInitStructure.TIM_Pulse = ccr2; //設置通道CH2/CH2N占空比
TIM_OC2Init(TIM1, &TIM_OCInitStructure); //通道CH2/CH2N初始化
TIM_OCInitStructure.TIM_Pulse = ccr3; //設置通道CH3/CH3N占空比
TIM_OC3Init(TIM1, &TIM_OCInitStructure); //通道CH3/CH3N初始化
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);
TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);
TIM1_BDTRInitStructure.TIM1_OSSRState = TIM1_OSSRState_Enable; //運行模式下輸出選擇
TIM1_BDTRInitStructure.TIM1_OSSIState = TIM1_OSSIState_Enable; //空閑模式下輸出選擇
TIM1_BDTRInitStructure.TIM1_LOCKLevel = TIM1_LOCKLevel_OFF; //鎖定設置
TIM1_BDTRInitStructure.TIM1_DeadTIM1 = 0xF2; //死區時間,2us
TIM1_BDTRInitStructure.TIM1_Break = TIM1_Break_Enable; //剎車功能使能
TIM1_BDTRInitStructure.TIM1_BreakPolarity =TIM1_BreakPolarity_High; //剎車輸入極性
TIM1_BDTRInitStructure.TIM1_AutomaticOutput =TIM1_AutomaticOutput_Enable; //自動輸出使能
TIM1_BDTRConfig(&TIM1_BDTRInitStructure);
TIM_Cmd(TIM1, ENABLE); //使能TIM1
TIM1_CtrlPWMOutputs(ENABLE); //使能TIM1的主輸出
}
至此,用TIM1產生6路PWM互補輸出的配置結束。
TIM1輸出初始化缺省值:
{
TIM1_OCMode = TIM1_OCMode_Timing;
TIM1_OutputState = TIM1_OutputState_Disable;
TIM1_OutputNState = TIM1_OutputNState_Disable;
TIM1_Pulse = TIM1_Pulse_Reset_Mask;
TIM1_OCPolarity = TIM1_OCPolarity_High;
TIM1_OCNPolarity = TIM1_OCNPolarity_High;
TIM1_OCIdleState = TIM1_OCIdleState_Reset;
TIM1_OCNIdleState = TIM1_OCNIdleState_Reset;
}
TIM1死區初始化缺省值:
{
TIM1_OSSRState = TIM1_OSSRState_Disable;
TIM1_OSSIState = TIM1_OSSIState_Disable;
TIM1_LOCKLevel = TIM1_LOCKLevel_OFF;
TIM1_DeadTime = TIM1_DeadTime_Reset_Mask;
TIM1_Break = TIM1_Break_Disable;
TIM1_BreakPolarity = TIM1_BreakPolarity_Low;
TIM1_AutomaticOutput = TIM1_AutomaticOutput_Disable;
}
主要完成任務:
1、對無霍爾BLDC電機程序作了更深層的理解,嘗試修改程序將 PWM_OFF的過零檢測模式換成PWM_ON,刪除程序冗余部分,對TIM 高級定時器的程序段作了詳細注釋,加深印象。
2、對有霍爾BLDC電機程序進行了解及解讀,基本上理解其運行原理及程序編寫方式。
帶霍爾元件的BLDC電機:
與不帶霍爾元件的電機的區別除了少了啟動檢測外,多了EXTI 外部中斷,電機的轉動程序在此中斷服務子程序中?;魻栐臋z測采用了三個中斷線路捕獲轉子位置。
對于其PWM輸出與無霍爾元件BLDC電機相同,換向也是用六步換向為霍爾六步換向,但無過零檢測即無ADC 外設的參與。
上一篇:【STM32電機矢量控制】記錄5——FOC原理大概
下一篇:【STM32電機方波】記錄3——TIM1時基初始化配置
推薦閱讀
史海拾趣
在電子行業的激烈競爭中,BOOKLY公司以其卓越的技術創新能力脫穎而出。公司初創時,僅是一個由幾位電子工程師組成的小團隊,專注于研發高效能、低功耗的芯片技術。經過數年的艱苦努力,BOOKLY成功推出了一款顛覆性的芯片產品,被廣泛應用于智能手機和電腦領域,迅速贏得了市場份額。此后,公司不斷投入研發,拓展產品線,逐漸在電子行業建立了自己的品牌地位。
自1997年成立以來,AnalogicTech便致力于技術創新,不斷推動電子行業的發展。公司總部位于硅谷,設計中心則分布在圣塔克拉拉和上海,匯聚了全球頂尖的研發人才。憑借深厚的技術底蘊和創新能力,AnalogicTech成功研發出一系列具有顛覆性的產品,為當今最具創造性的消費品提供了強大的技術支持。
ELNA公司的故事始于1940年代,當時該公司推出了其第一臺縫紉機。這款縫紉機以其精湛的工藝和卓越的性能迅速在市場上嶄露頭角。ELNA憑借對品質的堅持和對技術的不斷創新,逐漸在縫紉機行業樹立了良好的口碑。
隨著業務的擴展,ELNA開始涉足電子領域,并逐步將其在機械制造和精密加工方面的技術優勢應用到電子產品中。這一轉變為公司未來的發展奠定了堅實的基礎。
在無線通信技術快速發展的時代,Conexant公司積極尋求與業界領先企業的合作機會。2001年,Conexant宣布將其無線業務部門與Alpha Industries合并,共同創建一個價值約30億美元的新企業。這一合并不僅擴大了Conexant在無線通信領域的市場份額,也為其帶來了更多的技術資源和市場機會。合并后的新企業以Conexant為主導,通過整合雙方的優勢資源,實現了無線業務的快速發展和市場份額的穩步提升。
2017年,電子行業迎來了一場引人矚目的收購案。新思科技(Synaptics),一家在人機界面交互開發解決方案領域具有領導地位的公司,宣布以3.95億美元現金和726,666只普通股收購科勝訊系統公司(Conexant Systems)。這一收購行動不僅增強了Synaptics在智能家居領域的語音和音頻處理解決方案的能力,也標志著Conexant正式成為Synaptics大家庭的一員。通過此次收購,兩家公司實現了技術資源和市場優勢的互補,共同開啟了新的發展篇章。
2003年,Cardinal推出了首款可編程振蕩器,這一創新產品為客戶提供了更多的靈活性和定制性。隨著技術的不斷進步,公司在2006年引入了現場編程能力,進一步提升了產品的競爭力。這些技術創新不僅推動了公司的發展,也為整個電子行業帶來了新的機遇。
步進電機是一種離散運動的裝置,它和現代數字控制技術有著本質的聯系。在目前國內的數字控制系統中,步進電機的應用十分廣泛。隨著全數字式交流伺服系統的出現,交流伺服電機也越來越多地... … 查看全部問答∨ |
目錄: 第一編 模擬電子技術基礎實驗基本知識 第一章 概述 第二章 實驗程序 第三章 模擬電子技術基礎實驗常用儀器使用練習 第四章 萬用表對常用電子元器件的檢測 第五章 集成運算放大器的主要參數測試 第六章 電路故障分析、排除及抗干擾 ...… 查看全部問答∨ |
如果我要在NDIS中間驅動層攔截網絡數據包,那么,如果要把NDIS中間驅動層中截獲的一個NDIS封包全部輸出來,包括頭還有數據部分,以二進制的形式全部顯示出來,應如何實現呢?… 查看全部問答∨ |
|
在定入單字節中為什么是for(i=0;i<8;i++) { sck=0; sda=dat&0x01;//取出dat的第0位數據寫入1302 數據由低位開始傳 dat ...… 查看全部問答∨ |