如何采用STM32单片机产生PWM.doc

上传人:白大夫 文档编号:3429809 上传时间:2019-08-24 格式:DOC 页数:10 大小:45.50KB
返回 下载 相关 举报
如何采用STM32单片机产生PWM.doc_第1页
第1页 / 共10页
亲,该文档总共10页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《如何采用STM32单片机产生PWM.doc》由会员分享,可在线阅读,更多相关《如何采用STM32单片机产生PWM.doc(10页珍藏版)》请在三一文库上搜索。

1、如何采用STM32单片机产生PWMSTM32产生PWM是非常的方便的,要需要简单的设置定时器,即刻产生!(1)使能定时器时钟:RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);(2)定义相应的GPIO:/* PA2,3,4,5,6输出-Key_Up,Key_Down,Key_Left,Key_Right,Key_Ctrl */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6;GPIO_InitStructure.GPIO_

2、Mode = GPIO_Mode_IPU; /下拉接地,检测输入的高电平GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /50M时钟速度GPIO_Init(GPIOA, /* PA7用于发出PWM波 */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /50M时钟速度GPIO_Init(GPIOA, (3)如果是产生P

3、WM(频率不变,占空比可变),记得打开PWM控制,在TIM_ConfiguraTIon()中。TIM_Cmd(TIM3,ENABLE);/* TIM1 Main Output Enable */TIM_CtrlPWMOutputs(TIM1,ENABLE);利用定时器产生不同频率的PWM有时候,需要产生不同频率的PWM,这个时候,设置与产生相同PWM的程序,有关键的不一样。(一) 设置的原理利用改变定时器输出比较通道的捕获值,当输出通道捕获值产生中断时,在中断中将捕获值改变,这时, 输出的I/O会产生一个电平翻转,利用这种办法,实现不同频率的PWM输出。(二)关键设置在定时器设置中:TIM_O

4、C2PreloadConfig(TIM3, TIM_OCPreload_Disable);在中断函数中:if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET)TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);capture = TIM_GetCapture2(TIM3);TIM_SetCompare2(TIM3, capture + Key_Value);一个定时器四个通道,分别产生不同频率(这个例子网上也有)vu16 CCR1_Val = 32768;vu16 CCR2_Val = 16384;vu16 CCR3_Val

5、= 8192;vu16 CCR4_Val = 4096;void TIM_Configuration(void)TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;/* TIM2 clock enable */RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);/* -TIM2 Configuration: Output Compare Toggle Mode:TIM2CLK = 36 MHz, Prescaler = 0x2,

6、 TIM2 counter clock = 12 MHzCC1 update rate = TIM2 counter clock / CCR1_Val = 366.2 HzCC2 update rate = TIM2 counter clock / CCR2_Val = 732.4 HzCC3 update rate = TIM2 counter clock / CCR3_Val = 1464.8 HzCC4 update rate = TIM2 counter clock / CCR4_Val = 2929.6 Hz- */* Time base configuration */TIM_Ti

7、meBaseStructure.TIM_Period = 65535;TIM_TimeBaseStructure.TIM_Prescaler = 2;TIM_TimeBaseStructure.TIM_ClockDivision = 0;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM2, /* Channel 1 Configuration in PWM mode */TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle; /PWM模式

8、2TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; /正向通道有效TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;/反向通道无效TIM_OCInitStructure.TIM_Pulse = CCR1_Val;/占空时间TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; /输出极性TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolari

9、ty_High; /互补端的极性TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;TIM_OC1Init(TIM2, /通道1TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Disable);TIM_OCInitStructure.TIM_Pulse = CCR2_Val; /占空时间TIM_OC2Init(TIM2,/通道2TIM_OC2PreloadConfig(TIM2

10、, TIM_OCPreload_Disable);TIM_OCInitStructure.TIM_Pulse = CCR3_Val; /占空时间TIM_OC3Init(TIM2, /通道3TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Disable);TIM_OCInitStructure.TIM_Pulse = CCR4_Val; /占空时间TIM_OC4Init(TIM2,/通道4TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Disable);/* TIM2 counter enable */TIM_Cmd(TIM2,

11、ENABLE);/* TIM2 Main Output Enable */TIM_CtrlPWMOutputs(TIM2,ENABLE);/* TIM IT enable */TIM_ITConfig(TIM2, TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4, ENABLE);void GPIO_Configuration(void)GPIO_InitTypeDef GPIO_InitStructure;/*允许总线CLOCK,在使用GPIO之前必须允许相应端的时钟。从STM32的设计角度上说,没被允许的端将不接入时钟,也就不会耗能,这是S

12、TM32节能的一种技巧,*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);/* PA2,3,4,5,6,7输出-LED1,LED2,LED3,LED4,LED5,LED6 */GPIO_InitStructure.GPIO

13、_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; /开漏输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /50M时钟速度GPIO_Init(GPIOA, /* PB0,1输出-LED7,LED8*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;GPIO_InitStructure.GPIO_

14、Mode = GPIO_Mode_Out_OD; /开漏输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /50M时钟速度GPIO_Init(GPIOB, /* PA0,1-KEY_LEFT,KEY_RIGHT*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;? /上拉输入GPIO_Init(GPIOA, /* PC13-KEY_UP*/GPIO_InitStructure.GPIO_Pin =

15、 GPIO_Pin_13;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;? /上拉输入GPIO_Init(GPIOC, /* PB5-KEY_DOWN*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;? /上拉输入GPIO_Init(GPIOB, /* GPIOA Configuration:TIM2 Channel1, 2, 3 and 4 in Output */GPIO_InitStructure.GPIO_Pin =

16、GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, void NVIC_Configuration(void)NVIC_InitTypeDef NVIC_InitStructure;/* Configure one bit for preemption priority */NVIC_PriorityGroupConfig(

17、NVIC_PriorityGroup_1);NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(u16 capture = 0;extern vu16 CCR1_Val;extern vu16 CCR2_Val;extern vu16 CCR3_

18、Val;extern vu16 CCR4_Val;void TIM2_IRQHandler(void)/* TIM2_CH1 toggling with frequency = 183.1 Hz */if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)TIM_ClearITPendingBit(TIM2, TIM_IT_CC1 );capture = TIM_GetCapture1(TIM2);TIM_SetCompare1(TIM2, capture + CCR1_Val );/* TIM2_CH2 toggling with frequency =

19、 366.2 Hz */if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);capture = TIM_GetCapture2(TIM2);TIM_SetCompare2(TIM2, capture + CCR2_Val);/* TIM2_CH3 toggling with frequency = 732.4 Hz */if (TIM_GetITStatus(TIM2, TIM_IT_CC3) != RESET)TIM_ClearITPendingBit(TIM2, TIM

20、_IT_CC3);capture = TIM_GetCapture3(TIM2);TIM_SetCompare3(TIM2, capture + CCR3_Val);/* TIM2_CH4 toggling with frequency = 1464.8 Hz */if (TIM_GetITStatus(TIM2, TIM_IT_CC4) != RESET)TIM_ClearITPendingBit(TIM2, TIM_IT_CC4);capture = TIM_GetCapture4(TIM2);TIM_SetCompare4(TIM2, capture + CCR4_Val);一个定时器一

21、个通道,产生不同频率其它的设置都一样,就是在主函数中修改一个参数,然后在定时器中断中,根据这个参数,改变频率。#include “stm32libstm32f10x.h”#include “hal.h”volatile u16 Key_Value=1000;? /用于保存按键相应的PWM波占空比值int main(void)ChipHalInit();ChipOutHalInit();while(1)? if( (!Get_Key_Up)? ? ? Key_Value=12000;? ? else? ? ? if(Get_Key_Up)? ? /按键前进按下 ,对应1kHz? ? ? ? Ke

22、y_Value=6000;? ? ? ? else if(Get_Key_Down)? /按键后退按下 ,对应2kHz? ? ? ? ? Key_Value=3000;? ? ? ? Delay_Ms(20);? ? ? /10ms延时? ? if(Get_Key_Left)? ? /按键左转按下,对应3kHz? ? ? ? Key_Value=2000;? ? ? ? else if(Get_Key_Right) /按键右转按下,对应4kHz? ? ? ? ? Key_Value=1500;? ? ? ? Delay_Ms(20);? ? ? /10ms延时? ? if(Get_Key_Ct

23、rl)? ? /按键控制按下,对应5kHz? ? ? ? ? Key_Value=1200;? ? ? ? Delay_Ms(20);? ? ? /10ms延时? extern volatile u16 Key_Value;u16 capture=0;void TIM3_IRQHandler(void)/* TIM2_CH2 toggling with frequency = 366.2 Hz */if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET)? ? TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);capture

24、= TIM_GetCapture2(TIM3);? ? TIM_SetCompare2(TIM3, capture + Key_Value);void TIM3_Configuration(void)TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;/* TIM2 clock enable */RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);/*TIM1时钟配置*/TIM_TimeBaseStructure.TIM_Pre

25、scaler = 5;? ? ? /预分频(时钟分频)72M/6=12MTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;? /向上计数TIM_TimeBaseStructure.TIM_Period = 65535;? ? ? ? /装载值选择最大TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0;TIM_TimeBaseInit(TIM3,/* Channel 1 C

26、onfiguration in PWM mode */TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle; /PWM模式2TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; /正向通道有效TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;/反向通道无效TIM_OCInitStructure.TIM_Pulse = Key_Value; /占空时间TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; /输出极性TIM_OCInitStruct

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1