stm32 高级定时器产生PWM
来源:互联网 发布:不要说的秘密知乎 编辑:程序博客网 时间:2024/06/06 01:57
用stm32的高级定时器TIM1和TIM8产生PWM,需要注意:
1.都有TIM1,但只有flash容量大于256K的大容量单片机才有TIM8
2.高级定时器相对于通用定时器,多了TIM_CtrlPWMOutputs(TIM8, ENABLE);
TIM1产生四路PWM程序:
static void TIM1_GPIO_Config(void){ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9| GPIO_Pin_10 | GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); }static void TIM1_Mode_Config(void){ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; u16 CCR1_Val = 500; u16 CCR2_Val = 500; u16 CCR3_Val = 500; u16 CCR4_Val = 500; TIM_TimeBaseStructure.TIM_Period = 999; //当定时器从0计数到999,即为1000次,为一个定时周期 TIM_TimeBaseStructure.TIM_Prescaler = 71; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ; //设置时钟分频系数:不分频 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式 TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //配置为PWM模式1 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR1_Val; //设置跳变值,当计数器计数到这个值时,电平发生跳变 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //当定时器计数值小于CCR1_Val时为高电平 TIM_OC1Init(TIM1, &TIM_OCInitStructure); //使能通道1 TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR2_Val; //设置通道2的电平跳变值,输出另外一个占空比的PWM TIM_OC2Init(TIM1, &TIM_OCInitStructure); //使能通道2 TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable); TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR3_Val; //设置通道3的电平跳变值,输出另外一个占空比的PWM TIM_OC3Init(TIM1, &TIM_OCInitStructure); //使能通道3 TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable); TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR4_Val; //设置通道4的电平跳变值,输出另外一个占空比的PWM TIM_OC4Init(TIM1, &TIM_OCInitStructure); //使能通道4 TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM1, ENABLE); // 使能TIM1重载寄存器ARR TIM_CtrlPWMOutputs(TIM1, ENABLE); TIM_Cmd(TIM1, ENABLE); } void TIM1_PWM_Init(void){ TIM1_GPIO_Config(); TIM1_Mode_Config(); }
TIM8产生2路PWM程序:
static void TIM8_GPIO_Config(void){ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); }static void TIM8_Mode_Config(void){ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; u16 CCR1_Val = 500; u16 CCR2_Val = 500; u16 CCR3_Val = 500; u16 CCR4_Val = 500; TIM_TimeBaseStructure.TIM_Period = 999; //当定时器从0计数到999,即为1000次,为一个定时周期 TIM_TimeBaseStructure.TIM_Prescaler = 71; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ; //设置时钟分频系数:不分频 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式 TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //配置为PWM模式1 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR1_Val; //设置跳变值,当计数器计数到这个值时,电平发生跳变 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //当定时器计数值小于CCR1_Val时为高电平 TIM_OC1Init(TIM8, &TIM_OCInitStructure); //使能通道1 TIM_OC1PreloadConfig(TIM8, TIM_OCPreload_Enable); TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR2_Val; //设置通道2的电平跳变值,输出另外一个占空比的PWM TIM_OC2Init(TIM8, &TIM_OCInitStructure); //使能通道2 TIM_OC2PreloadConfig(TIM8, TIM_OCPreload_Enable); TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR3_Val; //设置通道3的电平跳变值,输出另外一个占空比的PWM TIM_OC3Init(TIM8, &TIM_OCInitStructure); //使能通道3 TIM_OC3PreloadConfig(TIM8, TIM_OCPreload_Enable); TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR4_Val; //设置通道4的电平跳变值,输出另外一个占空比的PWM TIM_OC4Init(TIM8, &TIM_OCInitStructure); //使能通道4 TIM_OC4PreloadConfig(TIM8, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM8, ENABLE); // 使能TIM8重载寄存器ARR TIM_CtrlPWMOutputs(TIM8, ENABLE); TIM_Cmd(TIM8, ENABLE); } void TIM8_PWM_Init(void){ TIM8_GPIO_Config(); TIM8_Mode_Config(); }
0 0
- stm32 高级定时器产生PWM
- STM32定时器产生PWM--呼吸灯
- STM32一定时器产生不同频率的PWM
- STM32一定时器产生不同频率的PWM
- STM32: 利用高级定时器产生6路互补PWM波形输出在BLDC中H-PWM-L-ON驱动方式下驱动无刷电机
- R4 STM32高级定时器笔记之PWM互补输出
- stm32 PWM & 定时器总结
- STM32定时器PWM输出
- 定时器产生PWM
- 单片机定时器产生pwm
- 通用定时器产生PWM
- STM32 定时器(二)——定时器产生不同频率的PWM
- stm32篇--定时器和PWM
- STM32通用定时器的PWM
- stm32的定时器和PWM
- stm32 定时器pwm输入捕获
- stm32定时器输入捕获pwm
- CC2530定时器T1产生PWM
- 如何获取JPEG图片质量和预测压缩图片大小
- LeetCode 22. Generate Parentheses 题解 —— Java
- BZOJ 1653 [Usaco2006 Feb]Backward Digit Sums
- java gc触发
- 大数据平台搭建之zookeeper
- stm32 高级定时器产生PWM
- 1017. A除以B (20)
- Activity横竖屏切换的那些事
- windows10 配置caffe 遇到的一些问题
- URIEncoding和UseBodyEncodingForURI的解释
- poj3186(搜索)
- 链接、装载与库——计算机组成
- Android Studio 导入 Android 源码
- MongoDB的安装与增删改查语句