采用内部定时器输入捕获功能。
采用普通的IO口设置外部中断+定时器的当时测量PWM信号的频率。
这两种方式比较推荐使用第一种,比较使用内部的资源可以节省CPU资源的利用,
当然当内部资源不够使用的时候,或者是说,硬件电路设计的时候没有连接相应的应引脚只能使用第二种方式了。
本次由于硬件电路设计的不足,导致需要测量PWM输入信号的引脚没有接到相应的通道上,对此使用了第二种方式:
注意:这里定时器中断的优先级要高于外部中断的优先级
思路如下:
设置PWM输入信号的引脚为外部中断的方式,并且触发方式为GPIO_MODE_IT_RISING_FALLING 上升,下降沿均可触发。
其次使能一个定时器TIM4,定时中断时间看自己需要测量频率来设置。(本次设置为2us –> 最大可测量的频率为50KHz)
外部中断中,上升沿到来,清空计数器TIM4->CNT=0,置一个上升沿的标志位为1,代表计算PWM时间的开始tim4_PWM_cnt++。
下降沿到来,置一个下降沿的标志为1
下一次上升沿到来,判断上一次是否为下降沿的标志,如果是,则代表PWM一个周期的时间已经到达。读取时间。PWM_Cycle = timer4_PWM_cnt2 并且把计数变量清零tim4_PWM_cnt = 0
接着下一次下降沿到来,判断上一次是否为上升沿的标志,如果是,则代表一个周期高电平结束,读取时间,即为脉宽 PWM_Duty = timer4_PWM_cnt2。
具体c语言实现代码如下:
if(__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_11) != RESET)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_11);//调用中断处理公用函数
if(PWM_EN()==1) //上升沿触发
{
TIM4->CNT=0;//这里清空TIM4计数。重新开始计数
if((PWM_FLAG_DOWM==1)&&(PWM_FLAG_UP==2))//判断上一次是否为下降沿
{
PWM_Cycle = timer4_PWM_cnt2;
timer4_PWM_cnt=0;
}
PWM_FLAG_CNT = 1;
PWM_FLAG_UP = 1;//上升沿标志
PWM_FLAG_DOWM = 2;//上升沿标志
}
else//下降沿触发
{
if((PWM_FLAG_DOWM==2)&&(PWM_FLAG_UP == 1))//下降沿判断上一个状态是否为上升沿
{
PWM_Duty = timer4_PWM_cnt2;
}
PWM_FLAG_DOWM=1;//下降沿标志
PWM_FLAG_UP=2;//下降沿标志
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void TIM4_Init(u16 arr,u16 psc)
{
TIM4_HandlerInstance=TIM4; //通用定时器4
TIM4_HandlerInitPrescaler=psc; //分频系数
TIM4_HandlerInitCounterMode=TIM_COUNTERMODE_UP; //向上计数器
TIM4_HandlerInitPeriod=arr; //自动装载值
TIM4_HandlerInitClockDivision=TIM_CLOCKDIVISION_DIV1; //时钟分频因子
HAL_TIM_Base_Init(&TIM4_Handler);
HAL_TIM_Base_Start_IT(&TIM4_Handler);//使能定时器4和定时器4更新中断:TIM_IT_UPDATE
}
void TIM4_IRQHandler(void)
{
HAL_TIM_IRQHandler(&TIM4_Handler);
if(PWM_FLAG_CNT == 1)//PWM上升沿到来标志
{
timer4_PWM_cnt++;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
pwm的频率和占空比之间的关系:
1、比如说,单片机频率10M,如果PWM频率是5M,那么一个PWM周期内就只有两个机器周期,那么占空比的值就只有0、50%、100%这三种。如果PWM频率是5k,那么一个PWM周期有2000个机器周期,占空比最小就可以去到1/2000=005%。
2、对于需要进行直流滤波的场合,频率越高,滤波的效果就越好。但是也不是说频率高一定好,太高的频率电机可能反应不过来。
3、而且,如果PWM是由单片机产生的,那么他的频率和位数是成反比的(一些低端的单片机频率基本是确定的,位数也是确定的,不存在这个问题),
占空比才是真正PWM应用的,其实就是开关的打开和关断的时间比值,这个比值在宏观上可以欺骗人眼,于是形成和电位器一样的作用。
比如对一个电灯来说,你在1秒内,打开开关05秒,再关闭05秒,如此反复,那么电灯就会闪烁,但是如果是1毫秒内,05毫秒打开,05毫秒关闭,由于视觉暂留作用,也可能由于灯光的亮灭速度赶不上开关速度(还没全亮就又没电了),于是人眼不感觉电灯在闪烁,而是感觉灯的亮度少了一半。同理,如果是01毫秒开,09毫秒灭,感觉灯的亮度就只有1/10了。
对于电机的原理也差不多,开关开时电机加速,关闭时电机减速,根据是加速时间多还是减速时间多,我们感觉总体的转速就是快了或慢了。当然,具体分析时还需考虑电机的电感作用,电感有滤波效果,但是用这个方式去理解也是成立的。
扩展资料:
随着电子技术的发展,出现了多种PWM技术,其中包括:相电压控制PWM、脉宽PWM法、随机PWM、SPWM法、线电压控制PWM等,而在镍氢电池智能充电器中采用的脉宽PWM法,它是把每一脉冲宽度均相等的脉冲列作为PWM波形,通过改变脉冲列的周期可以调频,改变脉冲的宽度或占空比可以调压,采用适当控制方法即可使电压与频率协调变化。可以通过调整PWM的周期、PWM的占空比而达到控制充电电流的目的。
模拟信号的值可以连续变化,其时间和幅度的分辨率都没有限制。9V电池就是一种模拟器件,因为它的输出电压并不精确地等于9V,而是随时间发生变化,并可取任何实数值。与此类似,从电池吸收的电流也不限定在一组可能的取值范围之内。模拟信号与数字信号的区别在于后者的取值通常只能属于预先确定的可能取值集合之内,例如在{0V,5V}这一集合中取值。
脉冲宽度调制(PWM)是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。
参考资料:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)