timer0 init:
//启用Timer0,Timer2时钟
set_tmr_enable(clk_per_reg_tmr_enabled);
//将Timer0,Timer2时钟分区因子设置为8
set_tmr_div(clk_per_reg_tmr_div_8);
//以所需的设置初始化PWM
timer0_init(tim0_clk_fast,pwm_mode_one,tim0_clk_no_div);
//设置PWM Timer0 On,Timer0'High'和Timer0'低'重载值
timer0_set(500,timer0_m_value,timer0_period_value-timer0_m_value);
根据我的测试,timer0_pwm_on_counter()中的pwm_on值有一个限制,即
- 当我将PWM_ON值设置为50时,测试中断周期为约0.5ms;
- 当我将PWM_ON值设置为500时,测试的中断周期保持在大约0.5ms;
- 当我将PWM_ON值设置为1000时,测试的中断周期仍保持在0.5ms的罕见;
- 当我将PWM_ON值设置为2000时,测试中断周期增加到大约1ms;
- 将PWM_ON值设置为4000时,测试中断周期增加到大约2ms
因此,只能设置最少的计时器0中断时间周期为0.5ms?我们希望有一个0.005ms〜0.01ms的计时器0中断时间周期,有没有办法来获得它?
好的......我可以通过init set_tmr_div(clk_per_reg_tmr_div_1)获得大约0.065ms的timer0中断周期;但是有没有办法缩短?
谢谢你。
嗨je,
你能帮忙看看我的问题吗?谢谢你!
亚历克斯。
嗨,亚历克斯:
set_tmr_div(clk_per_reg_tmr_div_8);
上面的时钟将Timer0时钟设置为16 MHz / 8 = 2MHz。
timer0_set的源是:
void timer0_set(uint16_t pwm_on,uint16_t pwm_high,uint16_t pwm_low)
{
setword16(timer0_on_reg,pwm_on);
setword16(timer0_reload_m_reg,pwm_high);
setword16(timer0_reload_n_reg,pwm_low);
}
Timer0_On_Reg设置在中断发生之前播放音调(如timer0_reload_m_reg和timer0_reload_n_reg)的持续时间。
什么时候(timer0_reLoad_m_reg == timer0_reload_n_reg),您获得50%的占空比。
关于中断的另一个重要事项是以下内容:当处于计数器达到零时,中断不会立即发生。如果On-Counter达到零,直到T0计数器也达到零,同时递减从Timer0_Reload_n_reg加载的值。然后只发生中断。T0计数器与Timer0_Reload_M_REG和TIMER0_RELOOD_N_REG的值交替加载。
我不知道将您加载到Timer0_reload_m_reg和timer0_reload_n_reg上的特定值。
我可以给你一个例子:下面在播放1000 Hz音调时每一个ms创建一个中断
#define conv(x)(2000000 /(2 * x))
Timer0_set(2000,CONC(1000),CONV(1000));
谢谢,
tr_dialog.
谢谢TR,因此中断周期通过ON-CONTER和/或(交替)M / N计数器决定。我会尝试其他测试......
我早先更新了这个例子。