arduino通过外部中断实现pwm占空比及周期读取

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;
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值