搜索
 找回密码
 立即注册

简单一步 , 微信登陆

MSD6488:水波纹与PWM动态同步

作者:SMC_lirt | 时间:2016-7-21 17:18:10 | 阅读:7917| 显示全部楼层
本帖最后由 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,在切换片源的时候会有很大的几率出现水波纹;



回复

使用道具 举报

大神点评2

xuludestiny 发表于:2016-7-21 17:37:13
水波纹处理方法
把水灌满
回复 支持 反对

使用道具 举报

150257 发表于:2019-4-7 12:18:15
学习了,不知有没MSD6A648的 datasheet呢? 能否帮忙发我一份呢
开心
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

SMC_lirt

主题 1
帖子 1
积分 1
此人很懒,什么也没留下。
阅读作者更多精彩帖子

热门问答

更多>
点击,跳转商城咨询客服
手机版