stm32f072--定时器17使用CH1N通道输出pwm时没有波形的原因_tim17输出pwm_西皮南子的博客-程序员宅基地

技术标签: stm32  

昨天刚写了篇文章分析定时器pwm输出初始化,以为都懂了再用会很简单,今天使用TIM17就出问题了— 。—

使用TIM17_CH1N对应引脚PB7,因为之前用的定时器15也是CH1N,就直接把TIM15的初始化搬过来改成TIM17,结果TIM15是有波形输出,而TIM17没有任何输出!!!真是奇怪了。。

void TIM17_PWM_Init(void)
{	
    uint16_t ChannelPulse = 0,PWM_TimerPeriod; 
    
	GPIO_InitTypeDef         GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef        TIM_OCInitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;	
    //引脚初始化
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM17 , ENABLE);  
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);//使能GPIOA时钟和复用功能时钟	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //TIM2二通道PWM波形输出端口PA1			 
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//设置引脚为推挽输出
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; 	//设置引脚为上拉		
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	//设置引脚速度为50MHZ
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_2);	
    
    /* 
        系统时钟48mhz,180us,周期10ms,48*1000*10 >65535,要分频
    */
	PWM_TimerPeriod = (unsigned int)( 1000*25 ) - 1;
    ChannelPulse = (uint16_t) (((uint32_t) 45 * (PWM_TimerPeriod - 1)) / 100);//占空比5%	
	/* Time 定时基础设置*/
	TIM_TimeBaseStructure.TIM_Prescaler = 48-1;
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  /* Time 定时设置为上升沿计算模式*/
	TIM_TimeBaseStructure.TIM_Period = PWM_TimerPeriod;
	TIM_TimeBaseStructure.TIM_ClockDivision = 0;
	TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM17, &TIM_TimeBaseStructure);	
	TIM_ARRPreloadConfig(TIM17, ENABLE);
    
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;             //TIM脉冲宽度调制模式1
	TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; //比较输出使能
	TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;     //输出极性:TIM输出比较极性高	
    TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;//输出空闲状态
	TIM_OCInitStructure.TIM_Pulse =ChannelPulse;              
	TIM_OC1Init(TIM17, &TIM_OCInitStructure);          //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
    
	TIM_OC1PreloadConfig(TIM17, TIM_OCPreload_Enable); //使能TIMx在CCR1上的预装载寄存器
	TIM_Cmd(TIM17, ENABLE);
  /* TIM1 Main Output Enable */
  TIM_CtrlPWMOutputs(TIM17, ENABLE);
}

开始找原因:

先对比T15和T17寄存器值的区别,没问题,再看手册,T17的寄存器没发现问题。。

试试修改参数,将有效脉冲由低改成高等改参数,没有波形;

T17开中断,中断函数加一个输出引脚的翻转,量这个引脚是会翻转,说明定时器计时没问题;

试试CH1通道输出pwm有没有波形,将引脚改为PB9,输出有波形!!再将CH1N也加进来,都有波形了!!

	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;             //TIM脉冲宽度调制模式1
	TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; //比较输出使能
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//TIM_OutputState_Enable
	TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;     //输出极性:TIM输出比较极性高	
    TIM_OCInitStructure.TIM_OCPolarity= TIM_OCPolarity_High;
    TIM_OCInitStructure.TIM_OCIdleState= TIM_OCIdleState_Reset;
    TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;//输出空闲状态
	TIM_OCInitStructure.TIM_Pulse =ChannelPulse;               //1200设置待装入捕获比较寄存器的脉冲值,取值必须在0x0000~0xFFFF之间,占空1200/2400
	TIM_OC1Init(TIM17, &TIM_OCInitStructure);          //根据TIM_OCInitStruct中指定的参数初始化外设TIMx

那就是CH1的参数影响CH1N了,将TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;

//TIM_OCInitStructure.TIM_OCPolarity= TIM_OCPolarity_High;隐掉这句,都没影响,还是有波形,那就差

TIM_OCInitStructure.TIM_OCIdleState= TIM_OCIdleState_Reset;就是这句影响了,将这句隐掉后就跟一开始一样,CH1N没有波形!!

那就看看这句到底是怎么影响的?

对比寄存器变化:

      (隐掉TIM_OCIdleState)                   (未隐掉TIM_OCIdleState)

看TIM_OCIdleState_Reset              ((uint16_t)0x0000)定义,并没有涉及其他位,怎么会有三位的值变化了,再看是不是不设置的话默认值不是0,仿真调试发现,没有设置TIM_OCIdleState时默认成了0x0115,也就是CR2|=0X0115,这也就解释了OIS1 (bit8)CCUS(bit2) CCPC(bit0)位都置1的原因了。

这个默认值0x0115是怎么来的??(未解决)

继续查是哪一位影响的:

将CCPC=0后有波形,

CCPC=1时没有波形。所以这一位导致的没有输出,那看看这一位是干什么的:

仅在有互补输出时起作用??(未解决)

TIM_OC1Init函数里:虽然写着assert_param检查参数范围,但是assert_param没有起作用,因为它的宏定义没有开。所以TIM_OCIdleState的值超范围了也没报错。

 

另外,TIM_OutputState,TIM_OCPolarity不设置使用默认值的话并不是0,虽然这个值没有影响。。。

对了,这个问题对TIM15并没有影响,TIM15的TIM_OCIdleState也是0x0115,但是它能有波形,奇怪不奇怪?

暂时的结论:

初始化设置完整一点,即使互补通道中只用一个通道,还是要将结构体TIM_OCInitStructure里的参数都附一个值:

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;    //TIM脉冲宽度调制模式1
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;//
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; //输出极性:TIM输出比较极性高	
TIM_OCInitStructure.TIM_OCPolarity= TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OCIdleState= TIM_OCIdleState_Reset;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;//输出空闲状态TIM_OCInitStructure.TIM_Pulse =ChannelPulse;               
TIM_OC1Init(TIM17, &TIM_OCInitStructure); 

后续:定时器15也出现问题了,没有开定时器时引脚输出高电平,还没具体找原因,只是像定时器17一样把参数都赋一遍值就好了,然后再改回去看看寄存器有什么不一样时问题不出现了,—。—

还是不清楚为什么没设置的默认参数会有问题!!

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_41976419/article/details/106857299

智能推荐

js--自定义圆角-程序员宅基地

参考了这篇博文,自己实现了下面的例子:http://www.99css.com/archives/146自适应圆角实现,传统方法: <div class="rc"> <b class="top"> <b class="rc1"></b> <b class="rc2"></b> ...

Qt错误:cannot open output file debug/xxx.exe:Permission denied的解决方案_:-1: error: cannot open output file debug\test1.ex-程序员宅基地

有的时候,运行刚刚运行好的QT程序,会出现:下面的窗口会报错:cannot open output file debug/xxx.exe:Permission denied现在说几个解决方案:1、启动任务管理器,在进程 — 应用中找到你在编写的程序将其进程结束后再次运行即可2、关闭编译器,重新启动3、电脑重新启动..._:-1: error: cannot open output file debug\test1.exe: permission denied

第三届蓝桥杯省赛单片机组自动售水机_自动售水机蓝桥杯代码-程序员宅基地

#include&lt;stc15f2k60s2.h&gt;#include "intrins.h"#define somenop {_nop_();_nop_();_nop_();nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(..._自动售水机蓝桥杯代码

关于服务器被挂挖矿病毒的解决方案_色猫软件-程序员宅基地

今天在玩阿里服务器的时候,突然服务器就变得非常的卡,敲几个字母就要卡一下,我第一反应是内存是不是满了,因为我用的是一个2G运存的服务器,内存满的情况也发生过很多次但是这次就很反常,内存非但没有满,甚至还有很多 free 的空间,那么就还有一种情况就是 cpu 爆了看了之后,发现有一个叫 kdevtmpfsi 的进程,这个进程我没有装过也不知道是个啥,结果去百度了一下,发现是一个挖..._色猫软件

android的wifi开发,android开发教程之wifi开发示例_老盐蛋炒饭的博客-程序员宅基地

1、 WIFI网卡的状态WIFI网卡的状态信息都以整型变量的形式存放在 android.net.wifi.WifiManager 类中,有以下状态:WIFI_STATE_DISABLEDWIFI网卡不可用WIFI_STATE_DISABLINGWIFI网卡正在关闭WIFI_STATE_ENABLEDWIFI网卡可用WIFI_STATE_ENABLINGWIFI网卡正在打开WIFI_STATE_UN..._安卓开发wifi通信代码及其结果

从零开始设计数据大屏—基于Vue ZT-程序员宅基地

从零开始设计数据大屏—基于Vue ZT 虽然已经决定这个项目用Wyn来做了,但是,了解一下如何从头开始写一个数据大屏还是挺有好玩的。-------------为什么要做数据大屏?现如今的大数据逐渐发挥出了它的力量,并无形的改变着我们的生活。但大数据在不是从事技术开发的人来说没有很明显的感受,很多人对大数据的概念只...

随便推点

BUUCTF-Misc-FLAG_buuctf misc flag-程序员宅基地

对图片进行尝试,发现最低位隐写的时候是个zip文件:save bin保存为zip文件,把压缩文件里的文件解压出来,file命令看到是elf文件:直接strings查看字符串就可拿到flag:或者直接放到ida中也可拿到flag:..._buuctf misc flag

电赛总结(二)——AD芯片总结之AD7705-程序员宅基地

1、特性参数 (1)16位无丢失代码性AD转化器 (2)只需要3.3V供电(即只需要单片机即可供电) (3)双通道差分输入 (4)基准电压为2.5V时,在单极性信号下,输入范围是0到2.5V,在双极性输入下,输入范围是-1.25到+1.25 (5)低功耗CMOS芯片,功耗一般为20uW (6)可编程,可编程增益,以及降噪参数等。 2、引脚排列 3、引脚功能说明 管脚名称 功能..._ad7705_writebyte

gridview 打开新页 并且传递参数-程序员宅基地

在 gridbview 中添加模板列 <ItemTemplate><asp:LinkButton ID="LinkButtonReport" runat="server" CausesValidation="False"Font-Size="12px" ForeColor="DimGray" Text="报告单" CommandArgument='&l...

Android移动开发-VR全景照片简单实现_panowidget-程序员宅基地

Android移动开发-VR全景照片简单实现VR技术的热度每年都在增长,在购物、旅游等方面运用度很高。该项目引用了Google的vr:sdk-panowidget依赖库,通过VrPanoramaView,简单实现在手机上查看全景照片,下面是项目介绍。build.gradle(Module:app)需要导入依赖:dependencies {implementation ‘com.google.vr:sdk-panowidget:1.30.0’}布局文件 activity_main.xml,调_panowidget

C++ 使用sqrt函数计算平方根_c++平方根函数-程序员宅基地

C++ 使用sqrt函数计算平方根#include<iostream>#include<cmath>void main(){ int n; std::cout << "请输入一个数:"; std::cin >> n; float f; f = std:: sqrt (n); std::cout << "该数的平方根为:" << f;}程序运行结果:..._c++平方根函数