本帖最后由 SMC_lirt 于 2016-7-21 17:18 编辑
平台:MSD6488概述:播放片源时,场频vfreq与PWMfreq不同步时会引起水波纹;以下以场频50hz切到60hz为例
相关内容:同步pwm主要在文件mapi_pql_customer.cpp内,如下:
1、场频变化时,底层会去执行PWM同步函数:void mapi_pql_customer::SetBacklightPWMFreq2PanelVFreq(void);之前msd6488用的不是动态同步pwm,即在同步pwm时直接获取到场频相关的值MS_U32 OutputVFreqX100 = MApi_XC_GetOutputVFreqX100();通过这个值来设定pwm;因为场频相关寄存器的值是一个渐变的过程,所以OutputVFreqX100 值不一定是准确的,从而造成场频和pwm不同步,出现水波纹;基于寄存器值渐变的依据,就有了动态同步的过程; 动态过程:用循环一次次去读寄存器的值,比较前后两次的值看是否已经稳定,当前后两次的差值已经在设定的允许范围之外就去同步pwm;
2、同步pwm时,首先跑到进程void* mapi_pql_customer::threadSignalMonitor(void *arg),通过读寄存器来获取场频值:
u8TempReg1 = MApi_XC_ReadByte(L_BK_LPLL(0x23));
u8TempReg2 = MApi_XC_ReadByte(H_BK_LPLL(0x23));
u8TempReg3 = MApi_XC_ReadByte(L_BK_LPLL(0x24));
u8TempReg4 = MApi_XC_ReadByte(H_BK_LPLL(0x0c));
VFreqreg = (MS_U32)u8TempReg3;
VFreqreg = ((VFreqreg << 16) + ((MS_U32)u8TempReg2 << 8) + (MS_U32)u8TempReg1) & 0x00FFFFFF;
tempVreq = (MS_FLOAT)24000000 / VFreqreg;
OutDlck = (MS_U32)(tempVreq * 1000 * (((u8TempReg4 >> 4) & 0x0F) + 1)); // / ((u8TempReg4 & 0x0F) + 1)
并且与上一个值对比,来确认是否同步pwm; if(abs(OutDlck_pre - OutDlck) > 20)
{
printf("\n\033[1;31m [%s:%d]need to sync \033[0m \n",__FUNCTION__, __LINE__);
mapi_pql::GetInstance(MAPI_PQ_MAIN_WINDOW)->SetBacklightPWMFreq2PanelVFreq_cus();
OutDlck_pre = OutDlck;
}
整个动态的过程可以通过设定循环次数来保证准确性,这个值可以根据实际情况合理设置;
if(Compare_Valid_Count == 15)
break;
原始问题:如果没有动态同步PWM,在切换片源的时候会有很大的几率出现水波纹;
|