【手拉手 带你准备电赛】使用定时器中断更改PWM占空比

目录

关于PWM占空比存在的问题及分析

相关问题的解决方案

具体程序设计

注意事项


关于PWM占空比存在的问题及分析

        在之前发布的有关占空比的文章中,我们看到输出信号的占空比只能在主函数中的while循环中更改。

        程序信号模拟图如下所示:

        这样更改占空比,存在的问题非常明显——占空比的改变并不规律。产生这种问题的原因是:我们改变占空比是通过下面这一条程序语句实现的。但是这条语句在主函数中的while循环中,也就是说,这条语句的运行时间是不确定的,所以没有办法准确的定位到每个周期,改变每个周期的占空比。

//改变占空比函数
//led0pwmval表示高电平开始的数值
TIM_SetCompare1(TIM1,led0pwmval);	   

相关问题的解决方案

        通过我们的分析可得,上述问题产生的原因在于我们没有办法准确的定位到每个周期,并作出相应的更改。为解决这一问题,我们使用了定时器。

        我们利用定时器进行计时,这样就可以精确定位到每个周期,为对每个周期的占空比进行更改提供了前提。然后我们在中断服务函数中编写程序,更改占空比,这样就达到了有规律的更改每个周期的占空比的效果。在主函数中的while循环就可以更改为空循环,其功能仅为使主函数一直运行下去。

具体程序设计

        具体的程序设计如下:

        1.由于我们使用的是TIM1,所以我们对其进行使能

TIM_ITConfig(TIM1,TIM1_UP_IRQn,ENABLE);

        2.然后我们进行中断的初始化

//初始化
NVICStruct.NVIC_IRQChannel=TIM1_UP_IRQn;
NVICStruct.NVIC_IRQChannelCmd=ENABLE;
NVICStruct.NVIC_IRQChannelPreemptionPriority=3;
NVICStruct.NVIC_IRQChannelSubPriority=2;
NVIC_Init(&NVICStruct);

        3.最后我们编写中断服务函数即可

void TIM1_UP_IRQHandler(void)
{
	
	if(TIM_GetITStatus(TIM1,TIM1_UP_IRQn) != RESET)
	{
		TIM_ClearITPendingBit(TIM1,TIM1_UP_IRQn);
		
		if(direction)p=p+100;
		else p=p-100;
		if(p>1000)direction=0;
		if(p==0)direction=1; 
		
		TIM_SetCompare2(TIM1, p);
		
	}
 
}

        修改后的模拟图就是下图了,从图中我们可以看出,我们的占空比在均匀的变化。已经达到了我们的目标实验效果。

 

 

注意事项

        1.在我们的中断服务函数中的变量需要使用全局变量,这样才能保证我们每次进入中断服务函数是,变量取值的连续性。

        2.在我们进行中断相关函数的编写时,有关的变量名、函数名需要去相关的文件中寻找,不要自己写(不然就会像我一样,一个问题一下午,错的醉生梦死,改完名字之后痛心疾首)。

        3.记得中断使能。

        好的,关于使用中断更改PWM的占空比,我们就分析到这里,你学废了吗?下篇文章见!

  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
使用定时器中断可以实现占空比的改变。首先,我们需要利用定时器进行计时,以精确定位到每个周期。然后,在中断服务函数中编写程序,通过改变占空比的方式来实现对每个周期的占空比更改。具体的步骤如下: 1. 初始化定时器:设置定时器的工作方式和初始值,开启定时器中断。 2. 在中断服务函数中编写程序:在定时器中断触发时,执行相应的操作。可以通过改变占空比的函数来实现对占空比更改。 3. 在主函数中设置空循环:将主函数中的while循环更改为空循环,使主函数一直运行下去。 需要注意的是,由于定时器中断的运行时间是不确定的,所以需要通过精确的计时和定位来确保占空比的改变是有规律的。可以使用定时器的计数器值来判断是否达到了需要改变占空比的时机,并在相应的时机执行占空比的改变操作。 以上是使用定时器中断实现占空比改变的一种方法,具体的实现方式可以根据具体的硬件平台和编程语言进行调整。 #### 引用[.reference_title] - *1* *2* [【手拉手 准备电赛使用定时器中断更改PWM占空比](https://blog.csdn.net/weixin_54354252/article/details/124208849)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [定时器中断实验(51单片机)](https://blog.csdn.net/weixin_60832830/article/details/130642778)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值