You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ATtiny13不修改预分频器加速AVR ISR实现COMPB 4倍频可行性咨询

ATtiny13双路PWM ISR优化与方案验证

核心需求梳理

  • 约束前提:不允许修改定时器预分频器,COMPA通道输出PWM频率固定,占空比覆盖22%~100%,不得大幅调整频率
  • 目标输出:COMPB通道输出频率为COMPA的4倍、占空比固定50%的方波
  • 现有实现:开启TIM0_COMPB中断,在中断中通过状态分支切换OCR0B值、翻转输出引脚,代码如下:
ISR(TIM0_COMPB_vect){
    switch (timing){
        case 0:
            OCR0B = 63;
            PORTB ^= (1 << PB3);
            timing = 1;
            break;
        case 1:
            OCR0B = 127;
            PORTB ^= (1 << PB3);
            timing = 2;
            break;
        case 2:
            OCR0B = 191;
            PORTB ^= (1 << PB3);
            timing = 3;
            break;
        case 3:
            OCR0B = 255;
            PORTB ^= (1 << PB3);
            timing = 0;
            break;
    }
}

现有实现的认知误区与问题

  • 不必要的分支开销:switch-case结构在编译后会生成多组比较、跳转指令,在ATtiny13这类资源极度有限的8位MCU上,会额外增加10~15个时钟周期的ISR执行时间,本身中断进出的压栈、出栈已经有固定开销,这部分逻辑完全可以精简。
  • 时序配置风险:当前设置的63/127/191/255四个匹配值,仅在定时器0配置为快速PWM模式、TOP=255时能实现4等间隔拆分周期的效果;如果用相位修正PWM模式,计数器为上下计数模式,这组匹配值会导致输出频率减半、占空比失真。
  • 输出抖动风险:软件翻转PORTB的操作如果放在分支判断之后,不同分支的执行时间差会带来1~2个时钟周期的引脚翻转抖动;如果临界时刻写OCR0B刚好赶上计数器匹配,还可能出现丢中断、脉冲宽度异常的问题。
  • 变量修饰遗漏:如果timing变量没有加volatile修饰,编译器可能会把它优化到通用寄存器中,导致中断里的状态更新异常,出现输出频率不对的问题。

不修改预分频器的优化方案

全程不需要调整预分频器配置,也不会影响COMPA通道的PWM输出,优化后ISR执行时间可以压缩到原来的1/3:

  1. 砍掉分支判断,用查表+位运算实现状态轮转
    提前把4个状态对应的OCR0B值存为Flash常量,用数组下标直接取值,用位与操作实现4状态循环,省掉所有分支判断:
    // 加volatile避免编译器优化,定义为全局变量
    volatile uint8_t timing = 0;
    // OCR0B配置表存在Flash,不占用宝贵的RAM资源
    const uint8_t ocrb_cfg[] PROGMEM = {63, 127, 191, 255};
    
    ISR(TIM0_COMPB_vect){
        // 优先翻转引脚,把输出延迟降到最低
        PORTB ^= (1 << PB3);
        // 直接查表取OCR0B值,无额外判断逻辑
        OCR0B = pgm_read_byte(&ocrb_cfg[timing]);
        // 单周期指令实现0-3状态循环
        timing = (timing + 1) & 0x03;
    }
    
  2. 优先用硬件翻转替代软件操作
    ATtiny13的TIM0_COMPB支持比较匹配自动翻转引脚功能,只要把TCCR0A寄存器的COM0B1、COM0B0位设置为0b01,就可以由硬件自动完成PB3(OC0B引脚)的电平翻转,不需要在ISR里写PORTB,又能省掉3~4个时钟周期的开销,还能完全消除软件翻转带来的抖动。

    注意:开启硬件翻转后,只需要在ISR里更新OCR0B值和轮转状态即可,引脚电平翻转完全由硬件完成,时序精度可达1个时钟周期。

  3. 配置校验
    必须把定时器0配置为快速PWM模式、TOP=255,这样COMPA通道的PWM双缓冲机制正常工作,占空比调整不会出毛刺,同时COMPB的4个匹配点刚好把256个计数周期拆成4个等长区间,输出频率刚好是COMPA的4倍,占空比固定50%。

可行性结论

核心实现思路完全可行,不需要修改预分频器就能实现需求,只要修正上述提到的配置和代码写法问题,就能得到稳定的输出,同时把ISR的运行开销降到最低。

内容的提问来源于stack exchange,提问作者user19334886

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 05:30:59