帮我写一个用PIC24HJ128GP504测量PWM高电平脉宽周期程序
时间: 2023-08-29 17:07:44 浏览: 107
好的,以下是用 PIC24HJ128GP504 测量 PWM 高电平脉宽周期的程序:
```c
#include <p24Hxxxx.h>
// 定义输入引脚和计时器编号
#define PWM_INPUT_PIN _RB0
#define TIMER_NUM 2
// 定义计时器相关寄存器
#define TMR_REG TMR2
#define TMR_IF _T2IF
#define TMR_IE _T2IE
#define TMR_IP _T2IP
#define TMR_ON _T2ON
#define TMR_PRESCALER 1
// 定义全局变量
volatile unsigned int pulse_width = 0; // 存储 PWM 高电平脉宽
volatile unsigned int period = 0; // 存储 PWM 周期
// 中断服务函数
void __attribute__((interrupt, no_auto_psv)) _T2Interrupt(void)
{
static unsigned int last_edge_time = 0;
unsigned int current_time = TMR_REG;
if (PWM_INPUT_PIN) // 如果当前为高电平
{
last_edge_time = current_time; // 记录上升沿时间
}
else // 如果当前为低电平
{
pulse_width = current_time - last_edge_time; // 计算高电平脉宽
period = current_time; // 记录当前时间为周期
}
TMR_IF = 0; // 清除计时器中断标志位
}
int main()
{
// 配置为输入模式
_TRISB0 = 1;
// 配置计时器
TMR_REG = 0;
TMR_PRE = TMR_PRESCALER - 1;
TMR_IF = 0;
TMR_IE = 1;
TMR_IP = 4;
TMR_ON = 1;
// 启用全局中断
_IPL = 0;
_GIE = 1;
while (1)
{
// 在此处添加需要执行的代码
}
}
```
这段程序中,我们使用了定时器的输入捕获功能来测量 PWM 高电平的脉宽和周期。在中断服务函数 `_T2Interrupt` 中,我们使用了静态变量 `last_edge_time` 来记录上一次上升沿的时间,然后在下降沿中计算出高电平脉宽和周期,并将其存储在全局变量中。在主函数中,你可以根据需要添加其他的代码。
阅读全文