pwm_on:timer0_set_pwm_on_counter(uint16_t pwm_on)

6个帖子/ 0新
最后一篇
亚历克斯
离线
最后一次露面:2年6个月前
加入:2014-08-20 03:39
pwm_on:timer0_set_pwm_on_counter(uint16_t pwm_on)

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中断时间周期,有没有办法来获得它?

亚历克斯
离线
最后一次露面:2年6个月前
加入:2014-08-20 03:39
好的......我可以获得约0.065ms

好的......我可以通过init set_tmr_div(clk_per_reg_tmr_div_1)获得大约0.065ms的timer0中断周期;但是有没有办法缩短?
谢谢你。

亚历克斯
离线
最后一次露面:2年6个月前
加入:2014-08-20 03:39
嗨je,

嗨je,
你能帮忙看看我的问题吗?谢谢你!

亚历克斯。

tr_dialog.
离线
最后一次露面:22小时21分钟前
职员
加入:2014-06-30 23:52
嗨,亚历克斯:

嗨,亚历克斯:

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.

亚历克斯
离线
最后一次露面:2年6个月前
加入:2014-08-20 03:39
谢谢tr,所以

谢谢TR,因此中断周期通过ON-CONTER和/或(交替)M / N计数器决定。我会尝试其他测试......

tr_dialog.
离线
最后一次露面:22小时21分钟前
职员
加入:2014-06-30 23:52
我已经更新了这个例子

我早先更新了这个例子。