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;
}
整個mian函數:
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控制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 服务器主板cpld芯片作用,CPLD的工
- 下一篇: Golf Range Finder 高尔