我們可以使用STM32來(lái)生成多路的PWM信號(hào)。首先我們來(lái)了解一下什么是PWM信號(hào),PWM的全稱為Pulse width modulation,即脈沖寬度調(diào)制,我們通常也稱PWM信號(hào)為占空比信號(hào)。PWM信號(hào)包含3個(gè)主要屬性:占空比、頻率、振幅。
信號(hào)頻率與周期:PWM信號(hào)頻率F與周期T的關(guān)系為 F = 1 / F,也就是說(shuō)頻率和周期互為倒數(shù)。例如,我們有一個(gè)頻率為400Hz的PWM信號(hào),那么每一個(gè)PWM周期的時(shí)間為2500us。
占空比:就是PWM方波信號(hào)高電平占整個(gè)信號(hào)周期的比例。例如:PWM周期為2500us,而每一個(gè)高電平的時(shí)長(zhǎng)為1000us,那么占空比為1000 / 2500 = 40%;
振幅:振幅就是高低電平差,也就是我們所說(shuō)的高電平的電壓,通常我們使用STM32單片機(jī)所產(chǎn)生的PWM信號(hào)為3.3V的PWM波,而有一些芯片和系統(tǒng)可能會(huì)產(chǎn)生5.0V或其它電壓的PWM波。
例如,我們給出兩個(gè)PWM信號(hào)的例子:
頻率400Hz;周期2500us;占空比44%;
頻率400Hz;周期2500us;占空比8%
注意,上圖中給出的ms表示毫秒,us表示微秒(1毫秒等于1000微秒,1ms等于1000us)。
接下來(lái),我們使用STM32F407來(lái)生產(chǎn)4路PWM信號(hào),首先開(kāi)啟TIM4和GPIOD的時(shí)鐘總線:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
然后,我們查看控制模塊的原理圖,找到需要生成PWM信號(hào)的4個(gè)引腳:
配置PD12、PD13、PD14、PD15這4個(gè)引腳,將它們配置為推挽輸出模式:
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系列,所以還需要打開(kāi)這4個(gè)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);
第三步,打開(kāi)配置TIM4的時(shí)鐘周期和PWM周期:
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Prescaler = 84 - 1; //配置預(yù)分頻數(shù)
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上計(jì)數(shù)
TIM_TimeBaseStructure.TIM_Period = 2500 - 1; //配置時(shí)鐘周期
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
第四步,配置TIM4的各個(gè)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的占空比值,然后開(kāi)啟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()函數(shù),將PD12、PD13、PD14和PD15分別設(shè)置高電平時(shí)長(zhǎng)為400us、800us、1800us和2200us。我們將程序編譯并燒錄到我們的控制模塊當(dāng)中,然后使用示波器或邏輯分析儀來(lái)查看PWM的信號(hào):
-
原理圖
+關(guān)注
關(guān)注
1316文章
6389瀏覽量
238096 -
單片機(jī)
+關(guān)注
關(guān)注
6058文章
44822瀏覽量
644722 -
PWM
+關(guān)注
關(guān)注
116文章
5315瀏覽量
217356 -
STM32
+關(guān)注
關(guān)注
2283文章
10986瀏覽量
361303 -
信號(hào)
+關(guān)注
關(guān)注
11文章
2834瀏覽量
77728
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論