日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

pwm原理与stm32控制

發布時間:2024/3/7 编程问答 59 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pwm原理与stm32控制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

做一件事情之前,我們首先肯定是要了解這個東西是什么。我們才能去對它進行開發。

一、pwm原理

PWM是Pulse Width Modulation的縮寫,
中文名字是脈沖寬度調制,一種說法是它利用微處理器的數字輸出來對模擬電路進行控制的一種有效的技術,其實就是使用數字信號達到一個模擬信號的效果
我們可以看一下下面這張圖,就可以很好的去理解pwm,其實就是占空比。
占空比是指高電平的時間占整個周期的比例。
說白了,其實就是高電平所占的周期時間

理解了原理之后,我們要如何應用呢?
其實pwm哎我們生活中到處都是,比如風扇調速、手機充電呼吸燈等等。

二、基本控制

stm32的定時器除了TIM6和7。其他的定時器都可以用來產生PWM輸出。其中高級定時器TIM1和TIM8可以同時產生7路的PWM輸出。而通用定時器也能同時產生多達4路PWM輸出,這樣,stm32最多可以同時產生30路PWM輸出;要使用STM32下的通用定時器TIMx產生PWM輸出,我們會用到3個寄存器,來控制PWM的。這三個寄存器是:捕獲/比較模式寄存器TIMx_CCMR1/2)、捕獲/比較使能寄存器(TIMx_CCER)、捕獲/比較寄存器(TIMx_CCR1~4)。注意,還有個TIMx的ARR寄存器是用來控制PWM輸出頻率的。

初始化設置:

void RCC_Config(void); void GPIO_Config(void); void TIM_Config(void); void RCC_Config(void) {//使能GPIOA,TIM2RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); } void GPIO_Config(void) { //GPIO的配置,官方庫有給出需要配置的一些參數,如果忘記了,參照一下即可,我這里配置的是GPIOA_Pin_1GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure); }

void TIM_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TImeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;

//配置TIM2的時鐘輸出頻率,以及其它相關參數初始化TIM_TImeBaseStructure.TIM_Prescaler=360-1;//設置PWM的頻率TIM_TImeBaseStructure.TIM_CounterMode=0;TIM_TImeBaseStructure.TIM_Period=100;TIM_TimeBaseInit(TIM2,&TIM_TImeBaseStructure);//設置PWM的輸出方式TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset; //配置占空比TIM_OCInitStructure.TIM_Pulse=50;TIM_OC2Init(TIM2,&TIM_OCInitStructure);TIM_ForcedOC1Config(TIM2,TIM_ForcedAction_Active);TIM_Cmd(TIM2,ENABLE);TIM_CtrlPWMOutputs(TIM2,ENABLE);

}
整個mian函數:

int main() {RCC_Config();GPIO_Config();TIM_Config();while(1){;} }

pwm.c

#include "pwm.h" #include "public.h" /******************************************************************************* * ? ? ? : pwm_init * ???? : IO???TIM3????? * ? ? : ? * ? ? : ? *******************************************************************************/ void pwm_Init() {GPIO_InitTypeDef GPIO_InitStructure; //?????????,?????GPIOTIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//?????????,????????TIM_OCInitTypeDef TIM_OCInitStructure;//??TIM_OCInitStruct???????????TIMx/* ???? */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);/* ??GPIO????IO? */GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;// PC6GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//??????GPIO_Init(GPIOC,&GPIO_InitStructure);//TIM3??????TIM_TimeBaseInitStructure.TIM_Period = 199; //PWM ??=72000/(199+1)=36Khz//??????????????TIM_TimeBaseInitStructure.TIM_Prescaler = 7199;//??????TIMx????????TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;//??????:TDTS = Tck_timTIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM??????TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);//????????? //pC6//PWM??? //??TIM_OCInitStruct???????????TIMxTIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//PWM????TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;TIM_OC1Init(TIM3,&TIM_OCInitStructure);//????????TIM_OC1Init???TIM_OCInit,??????????????????TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);//??????TIMx?CCR1????????TIM_Cmd(TIM3,ENABLE);//??????TIMx?? }

pwm.h

#ifndef __PWM_H #define __PWM_Hvoid pwm_Init(void);#endif

自此完成基本配置,下面我將再寫一篇應用開發。更新有點慢,見諒。
參考鏈接

總結

以上是生活随笔為你收集整理的pwm原理与stm32控制的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。