STM32系列基於專為要求高性能、低成本、低功耗的嵌入式應用專門設計的ARM Cortex-M3內核(ST『s product portfolio contains a comprehensive range of microcontrollers, from robust, low-cost 8-bit MCUs up to 32-bit ARM-based Cortex®-M0 and M0+, Cortex®-M3, Cortex®-M4 Flash microcontrollers with a great choice of peripherals. ST has also extended this range to include an ultra-low-power MCU platform)[1] 。按內核架構分為不同產品:
其中STM32F系列有:STM32F103「增強型」系列STM32F101「基本型」系列STM32F105、STM32F107「互聯型」系列
增強型系列時鐘頻率達到72MHz,是同類產品中性能最高的產品;基本型時鐘頻率為36MHz,以16位產品的價格得到比16位產品大幅提升的性能,是32位產品用戶的最佳選擇。兩個系列都內置32K到128K的快閃記憶體,不同的是SRAM的最大容量和外設接口的組合。時鐘頻率72MHz時,從快閃記憶體執行代碼,STM32功耗36mA,相當於0.5mA/MHz。
General Purpose Input Output (通用輸入/輸出)簡稱為GPIO,或總線擴展器,人們利用工業標準I2C、SMBus或SPI接口簡化了I/O口的擴展。當微控制器或晶片組沒有足夠的I/O埠,或當系統需要採用遠端串行通信或控制時,GPIO產品能夠提供額外的控制和監視功能。
分類:硬體/嵌入開發驅動開發/核心開發
每個GPIO埠可通過軟體分別配置成輸入或輸出。Maxim的GPIO產品線包括8埠至28埠的GPIO,提供推挽式輸出或漏極開路輸出。提供微型3mm x 3mm QFN封裝。
PWM控制技術以其控制簡單,靈活和動態響應好的優點而成為電力電子技術最廣泛應用的控制方式,也是人們研究的熱點。由於當今科學技術的發展已經沒有了學科之間的界限,結合現代控制理論思想或實現無諧振波開關技術將會成為PWM控制技術發展的主要方向之一。其根據相應載荷的變化來調製電晶體基極或MOS管柵極的偏置,來實現電晶體或MOS管導通時間的改變,從而實現開關穩壓電源輸出的改變。這種方式能使電源的輸出電壓在工作條件變化時保持恆定,是利用微處理器的數位訊號對模擬電路進行控制的一種非常有效的技術。
使用了STM32F10364引腳的MCU,在硬體設計中,因為外設較多,導致每個通用定時器至少有兩個PWM輸出引腳被佔用,現在要控制RGB燈,只能用一個普通IO引腳模擬PWM輸出。
相關的硬體電路設置如下:
GPIOA1------------------------------RGBBLUE燈
GPIOB1------------------------------RGBGREEN燈
GPIOD2------------------------------RGBRED燈
RGB燈採用了共陽極電路,所以在PWM的輸出急性設置時,將極性設置為高電平,定時器的初始化如下圖所示:
void initLedTimer( void ){
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_DeInit( TIM2 );
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure );
TIM_TimeBaseStructure.TIM_Period =TIMER_PERIOD;
TIM_TimeBaseStructure.TIM_Prescaler =TIMER_PRESCALER;
TIM_TimeBaseStructure.TIM_ClockDivision= TIM_CKD_DIV1; // 不分頻
TIM_TimeBaseStructure.TIM_CounterMode =TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
TIM_OCStructInit(&TIM_OCInitStructure );
TIM_OCInitStructure.TIM_OCMode =TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OutputState =TIM_OutputState_Disable;
TIM_OCInitStructure.TIM_Pulse =DEFAULT_DUTY_CYCLE;
TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_High;
//
TIM_OC1Init(TIM2,&TIM_OCInitStructure);
//
TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable);
//
TIM_OC2Init(TIM2,&TIM_OCInitStructure);
//
TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Enable);
//
TIM_OC3Init(TIM3,&TIM_OCInitStructure);
//
TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable);
//
TIM_OC4Init(TIM3,&TIM_OCInitStructure);
//
TIM_OC4PreloadConfig(TIM3,TIM_OCPreload_Enable);
//
TIM_OCStructInit(&TIM_OCInitStructure );
TIM_OCInitStructure.TIM_OCMode =TIM_OCMode_Timing;
TIM_OCInitStructure.TIM_Pulse =DEFAULT_DUTY_CYCLE;
//
TIM_OC2Init(TIM3,&TIM_OCInitStructure);
//
TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);
// ARR重裝載使能
TIM_ARRPreloadConfig(TIM2,ENABLE);
TIM_ARRPreloadConfig(TIM3,ENABLE);
//
TIM_ClearITPendingBit( TIM2,TIM_IT_Update );
TIM_ClearITPendingBit( TIM3,TIM_IT_Update | TIM_IT_CC2 );
//定時器2和3中斷使能
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
TIM_ITConfig(TIM3,TIM_IT_Update |TIM_IT_CC2, ENABLE);
}
輸出極性為高電平的意思就是說,假如說佔空比為20%,那麼他表示,低電平佔整個周期20%的時間,反之如果設置極性為低電平,那麼表示高電平佔用整個周期的20%。
如何用GPIOD2模擬PWM波形呢? 關鍵的地方就是同時必須使用定時器中斷
打開APP閱讀更多精彩內容聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容圖片侵權或者其他問題,請聯繫本站作侵刪。 侵權投訴