arduino通过外部中断实现pwm占空比及频率读取
准备:
- 电脑一个
- Arduino UNO板子一个
- 人手两只~~
代码~~
#define input1 digitalRead(2)
volatile uint64_t count = 0; //记录定时器3中断服务函数进入次数
volatile uint64_t pwm_period_one = 0; //pwm周期 单位:微妙
volatile uint64_t pwm_exp_one = 0; //pwm占空比:0-100
void setup() {
// put your setup code here, to run once:
Timer1.initialize(10); // initialize timer1, micro unit: us (#include <TimerOne.h> 需要安装TimerOne库)
Timer1.attachInterrupt(TIM3_IT);
}
void TIM3_IT(void)
{
count++;
return ;
}
void blink1()
{
static volatile uint8_t high_flag = 0;
static volatile uint8_t low_flag = 0;
static volatile uint64_t Counter1_1 = 0;
static volatile uint64_t Counter1_2 = 0;
static volatile uint64_t current_count = 0;
if(low_flag == 1)
{
//当前时间戳
current_count = count;
//计算当前占空比及PWM频率
if(Counter1_2 < Counter1_1) //PWM过低时需要修正
Counter1_2 = Counter1_1;
if(Counter1_2 > current_count) //PWM过高时,需要修正
Counter1_2 = current_count;
volatile int64_t pwm_exp_one_temp =10 * (Counter1_2 - Counter1_1 + 0.0) * 100.0 / (0.0 + current_count - Counter1_1);
if(pwm_exp_one_temp > 100)
pwm_exp_one_temp = 100;
else if(pwm_exp_one_temp < 0)
{
pwm_exp_one_temp = 0;
}
volatile uint64_t pwm_period_one_temp = (current_count - Counter1_1) * 10.0;
if(pwm_period_one_temp < 100000)//此时周期超过100ms ,错误数据,将会丢弃!,
{
//死区优化
if(pwm_exp_one_temp < PWM_DUTY_CYCLE_MID + PWM_DUTY_CYCLE_DEATH \
&& pwm_exp_one_temp > PWM_DUTY_CYCLE_MID - PWM_DUTY_CYCLE_DEATH) pwm_exp_one_temp = PWM_DUTY_CYCLE_MID;
pwm_exp_one = pwm_exp_one_temp;
pwm_period_one = pwm_period_one_temp;
}
//重新更新初始化数据,准备计算下一次PWM参数
high_flag = 0;
low_flag = 0;
//count = 0;
Counter1_1 = 0;
Counter1_2 = 0;
}
if(input1 == HIGH)
{
Counter1_1 = count;
high_flag = 1;
}
if(input1 == LOW && high_flag == 1)
{
Counter1_2 = count;
low_flag = 1;
}
}