stm32f051 TIM15、16、17 无法出PWM
来源:互联网 发布:java写qq登入跳出聊天 编辑:程序博客网 时间:2024/06/10 12:28
今天调了一块stm32f051,号称有11个timers,其中有6个可以产生pwm波。由于项目需要一块板子带着5个步进电机,所以需要五个单独的timer产生PWM,所以上手了这样一块板子,TIM2、TIM3和TIM14很轻松实现,结果TIM17怎么调也调不出来,我研究了半天包括网上的资料也很少,写下来帮助后人踏过这个坑。
首先将TIM2的代码贴在下面,我用PB10选择的TIM2_CH3产生PWM1:
void PWM1_Init(int arr,int psc){ GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure ;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//ʹÄܶ¨Ê±Æ÷1ʱÖÓ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); //ʹÄÜGPIOÄ£¿éʱÖÓGPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_2);//ÅäÖÃPB10³ÉµÚÈý¹¦ÄÜÒý½ÅGPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //TIM2_CH3GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_Init(GPIOB, &GPIO_InitStructure);//³õʼ»¯GPIO //³õʼ»¯TIM2TIM_TimeBaseStructure.TIM_Period = arr; //ÉèÖÃÔÚÏÂÒ»¸ö¸üÐÂʼþ×°Èë»î¶¯µÄ×Ô¶¯ÖØ×°ÔؼĴæÆ÷ÖÜÆÚµÄÖµTIM_TimeBaseStructure.TIM_Prescaler =psc; //ÉèÖÃÓÃÀ´×÷ΪTIMxʱÖÓƵÂʳýÊýµÄÔ¤·ÖƵֵ TIM_TimeBaseStructure.TIM_ClockDivision = 0; //ÉèÖÃʱÖÓ·Ö¸î:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIMÏòÉϼÆÊýģʽTIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //¸ù¾ÝTIM_TimeBaseInitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯TIMxµÄʱ¼ä»ùÊýµ¥Î»//³õʼ»¯TIM2 Channel PWMģʽ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //Ñ¡Ôñ¶¨Ê±Æ÷ģʽ:TIMÂö³å¿í¶Èµ÷ÖÆģʽ2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //±È½ÏÊä³öʹÄÜTIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //Êä³ö¼«ÐÔ:TIMÊä³ö±È½Ï¼«ÐÔ¸ßTIM_OCInitStructure.TIM_Pulse = (arr+1)/2; //ÉèÖÃÕ¼¿Õ±ÈΪ50%TIM_OC3Init(TIM2, &TIM_OCInitStructure); //ʹÄÜTIM2ÔÚCCR3ÉϵÄԤװÔؼĴæÆ÷TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable); //ʹÄÜTIM2TIM_ARRPreloadConfig(TIM2, ENABLE);TIM_Cmd(TIM2, ENABLE);}好吧,从万恶的MDK编辑器里复制过来,中文注释不见了,再贴一张图:
好的,我想这个TIM16依葫芦画瓢也应该很easy,我用PA6选择的TIM16_CH1产生PWM编写代码如下:
坑爹的情况出现了,这玩意一直给我输出一个高电平,压根不是PWM。
我仔细检查了N遍,debug了无数次,百思不得其解,后来研究了半天,找到了答案。
看下图:
你没有看错,就这玩意有问题了。
咋一看,其实没看出来什么。其实是TIM15、16、17这个三个定时器和TIM2等不一样,
结构体 TIM_OCInitTypeDef TIM_OCInitStructure ;
里面有些默认没有赋值的参数对TIM15、16、17的初始化会影响它产生PWM,所以代码将结构体申明的时候直接给初始值就好,例如:
TIM_OCInitTypeDef TIM_OCInitStructure = { 0 };
自此完美解决TIM15、16、17无法产生PWM的情况。阅读全文
0 0
- stm32f051 TIM15、16、17 无法出PWM
- PWM
- PWM
- pwm
- PWM?
- PWM
- PWM
- PWM
- PWM
- PWM
- PWM
- PWM
- PWM
- PWM
- PWM
- Axure无法签出
- STM32F051 IIC模块代码
- STM32F051 触摸按键功能
- 数据库及表、列的操作
- layui的checbox在Ajax局部刷新下的设置
- 高可用负载均衡集群Heartbeat+Ldirectord+lvs-DR的搭建
- windows 批量杀nginx进程
- sql
- stm32f051 TIM15、16、17 无法出PWM
- cocoapods安装使用及遇到的坑
- Android系统架构介绍.
- H
- fragment懒加载
- 数据库对象是数据库的组成部分,常见的有以下几种:
- 189. Rotate Array
- github上传文件的步骤
- tqdm使用方法