背光频率的算法:
芯片内部基础时钟12MHz (12000000Hz)
首先divider 对12M 分配得出一个 base frequency,用于基础计数。
我们程序中所设置的 PERIOD 和 DUTY 都是对base frequency的计数,并且DUTY 的数值永远要小于等于 PERIOD ,当DUTY 等于 PERIOD 时,就是100%占空比,其实也就是直流电平了。
我们程序中调节背光强度,实际就是调整的DUTY 的值,但DUTY 永远要小于PERIOD 。
12M
DIVIDER 对12MHz 进行分频,得到base frequency
再对base frequency
进行分频,得到PWM 调DIVEDER 和PERIOD 值都能改变PWM 频率我们程序现在做法是固定PERIOD 为255再根据实际所需的PWM 频率计算出需要的DIVIDER 值因此DUTY 调节的范围就是0~255(PERIOD )
DUTY 为255时就输出直流电平,此时背光最亮
我们常用的就下面四个函数,在GPIO_MST.c中调用。
//对设置分频比 --- 对12M 进行分频
void MDrv_PWM_Div(PWM_ChNum u8IndexPWM, MS_U16 u16DivPWM);
//PWM极性 --- PWM高低电平反向
void MDrv_PWM_Polarity(PWM_ChNum u8IndexPWM, MS_BOOL bPolPWM);
//周期
PWM_Result MDrv_PWM_Period(PWM_ChNum u8IndexPWM, MS_U32 u32PeriodPWM); //占空比
PWM_Result MDrv_PWM_DutyCycle(PWM_ChNum u8IndexPWM, MS_U32 u32DutyPWM);
现在一般我们程序中PERIOD 固定255
在相应的board 文件中有如下定义
#define PWM2_PERIOD 0xFF //PWM2 Period=( PWM2_PERIOD+1 ) *( 1/ Xtal)
这里面Xtal = 12000000 PWM2_PERIOD = 0xFF(我们程序固定)
假设我们知道需要输出PWM 频率是,我们可以计算出需要的divider 的值,公式如下
[(Divider+1)/ 12000000] * (Period+1) = 1/Pwm_Freq
可以得出 Divider = 12000000/Pwm_Freq/(Period+1) – 1
如果PWM 频率要求 100Hz ,可以计算出
Divider = 12000000/100/256 – 1 = 467.75
如果PWM 频率要求 50KHz ,可以计算出
Divider = 12000000/50000/256 – 1 = -0.0625
之所以得出负数,是因为我们限制了PERIOD 为255,这时 divider 设置成0,不对12M 分频,刚好可以得出接近50KHz 的频率。
一般来说 lamp 背光频率在20KHz ~ 50KHz,led 背光范围一般在100Hz 左右,所以我们固定PERIOD 为255,去计算divider ,一般都能满足要求。
小数可以取舍,看设置哪个指更接近PWM 频率要求,一般PWM 频率差点没关系。
背光频率的算法:
芯片内部基础时钟12MHz (12000000Hz)
首先divider 对12M 分配得出一个 base frequency,用于基础计数。
我们程序中所设置的 PERIOD 和 DUTY 都是对base frequency的计数,并且DUTY 的数值永远要小于等于 PERIOD ,当DUTY 等于 PERIOD 时,就是100%占空比,其实也就是直流电平了。
我们程序中调节背光强度,实际就是调整的DUTY 的值,但DUTY 永远要小于PERIOD 。
12M
DIVIDER 对12MHz 进行分频,得到base frequency
再对base frequency
进行分频,得到PWM 调DIVEDER 和PERIOD 值都能改变PWM 频率我们程序现在做法是固定PERIOD 为255再根据实际所需的PWM 频率计算出需要的DIVIDER 值因此DUTY 调节的范围就是0~255(PERIOD )
DUTY 为255时就输出直流电平,此时背光最亮
我们常用的就下面四个函数,在GPIO_MST.c中调用。
//对设置分频比 --- 对12M 进行分频
void MDrv_PWM_Div(PWM_ChNum u8IndexPWM, MS_U16 u16DivPWM);
//PWM极性 --- PWM高低电平反向
void MDrv_PWM_Polarity(PWM_ChNum u8IndexPWM, MS_BOOL bPolPWM);
//周期
PWM_Result MDrv_PWM_Period(PWM_ChNum u8IndexPWM, MS_U32 u32PeriodPWM); //占空比
PWM_Result MDrv_PWM_DutyCycle(PWM_ChNum u8IndexPWM, MS_U32 u32DutyPWM);
现在一般我们程序中PERIOD 固定255
在相应的board 文件中有如下定义
#define PWM2_PERIOD 0xFF //PWM2 Period=( PWM2_PERIOD+1 ) *( 1/ Xtal)
这里面Xtal = 12000000 PWM2_PERIOD = 0xFF(我们程序固定)
假设我们知道需要输出PWM 频率是,我们可以计算出需要的divider 的值,公式如下
[(Divider+1)/ 12000000] * (Period+1) = 1/Pwm_Freq
可以得出 Divider = 12000000/Pwm_Freq/(Period+1) – 1
如果PWM 频率要求 100Hz ,可以计算出
Divider = 12000000/100/256 – 1 = 467.75
如果PWM 频率要求 50KHz ,可以计算出
Divider = 12000000/50000/256 – 1 = -0.0625
之所以得出负数,是因为我们限制了PERIOD 为255,这时 divider 设置成0,不对12M 分频,刚好可以得出接近50KHz 的频率。
一般来说 lamp 背光频率在20KHz ~ 50KHz,led 背光范围一般在100Hz 左右,所以我们固定PERIOD 为255,去计算divider ,一般都能满足要求。
小数可以取舍,看设置哪个指更接近PWM 频率要求,一般PWM 频率差点没关系。