我們可以使用STM32來生成多路的PWM信號。首先我們來了解一下什么是PWM信號,PWM的全稱為Pulse width modulation,即脈沖寬度調制,我們通常也稱PWM信號為占空比信號。PWM信號包含3個主要屬性:占空比、頻率、振幅。
信號頻率與周期:PWM信號頻率F與周期T的關系為 F = 1 / F,也就是說頻率和周期互為倒數。例如,我們有一個頻率為400Hz的PWM信號,那么每一個PWM周期的時間為2500us。
占空比:就是PWM方波信號高電平占整個信號周期的比例。例如:PWM周期為2500us,而每一個高電平的時長為1000us,那么占空比為1000 / 2500 = 40%;
振幅:振幅就是高低電平差,也就是我們所說的高電平的電壓,通常我們使用STM32單片機所產生的PWM信號為3.3V的PWM波,而有一些芯片和系統可能會產生5.0V或其它電壓的PWM波。
例如,我們給出兩個PWM信號的例子:
頻率400Hz;周期2500us;占空比44%;
頻率400Hz;周期2500us;占空比8%
注意,上圖中給出的ms表示毫秒,us表示微秒(1毫秒等于1000微秒,1ms等于1000us)。
接下來,我們使用STM32F407來生產4路PWM信號,首先開啟TIM4和GPIOD的時鐘總線:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
然后,我們查看控制模塊的原理圖,找到需要生成PWM信號的4個引腳:
配置PD12、PD13、PD14、PD15這4個引腳,將它們配置為推挽輸出模式:
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_Init(GPIOD, &GPIO_InitStructure);
由于我們使用的STM32F4xx系列,所以還需要打開這4個GPIO腳的AF的PinSource功能:
GPIO_PinAFConfig(GPIOD, GPIO_PinSource12, GPIO_AF_TIM4);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource13, GPIO_AF_TIM4);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_TIM4);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_TIM4);
第三步,打開配置TIM4的時鐘周期和PWM周期:
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Prescaler = 84 - 1; //配置預分頻數
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上計數
TIM_TimeBaseStructure.TIM_Period = 2500 - 1; //配置時鐘周期
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
第四步,配置TIM4的各個PWM通道:
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM4, &TIM_OCInitStructure); //通道1
TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);
TIM_OC2Init(TIM4, &TIM_OCInitStructure); //通道2
TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);
TIM_OC3Init(TIM4, &TIM_OCInitStructure); //通道3
TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);
TIM_OC4Init(TIM4, &TIM_OCInitStructure); //通道4
TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);
最后,分別配置4路PWM的占空比值,然后開啟TIM4:
TIM_SetCompare1(TIM4, 400);
TIM_SetCompare2(TIM4, 800);
TIM_SetCompare3(TIM4, 1800);
TIM_SetCompare4(TIM4, 2200);
TIM_ARRPreloadConfig(TIM4, ENABLE);
TIM_Cmd(TIM4, ENABLE);
TIM_CtrlPWMOutputs(TIM4, ENABLE);
我們使用了TIM_SetCompare1/2/3/4()函數,將PD12、PD13、PD14和PD15分別設置高電平時長為400us、800us、1800us和2200us。我們將程序編譯并燒錄到我們的控制模塊當中,然后使用示波器或邏輯分析儀來查看PWM的信號:
-
原理圖
+關注
關注
1299文章
6347瀏覽量
234496 -
單片機
+關注
關注
6039文章
44583瀏覽量
636483 -
PWM
+關注
關注
114文章
5193瀏覽量
214233 -
STM32
+關注
關注
2270文章
10910瀏覽量
356601 -
信號
+關注
關注
11文章
2794瀏覽量
76894
發布評論請先 登錄
相關推薦
評論