摘要: 伽玛校正用于校正亮度和亮度之间的非线性关系。本应用笔记介绍了为MAXQ2000微控制器(µC)编写的汇编程序,该程序使用固定频率PWM信号的伽马校正来线性增加和减少LED的亮度。PWM占空比,存储在查找表(LUT)位于实用程序ROM存储器,伽马校正产生线性亮度变化。该软件使用免费的MAX-IDE开发工具编译,并在MAXQ2000评估套件上运行。
当LED发光时,伽马校正用于解释亮度和亮度之间的幂律关系。亮度和亮度虽然经常互换使用,但并不是同义词。
亮度:单位面积上投射出来的光,单位为cd/m²(坎德拉/m²)。
亮度:人眼所感知到的亮度。
幂律关系可以近似为:
在这个讨论中,γ等于2.5。
附录A是一个组装程序,线性地增加和减少LED的亮度。强度值已经过伽玛校正,以近似于亮度的线性变化。
LED采用PWM控制。定时器0在P0.0上产生PWM信号(在MAX2000评估套件上U11的LED3上可见),并设置为16位重新加载/比较定时器模式。在这种模式下,Timer 0产生两个irq (interrupt request):一个是定时器溢出时,另一个是定时器等于T2C0中的比较值时。图1说明了这个过程是如何产生PWM信号的。注意,溢出IRQ控制PWM周期,而比较IRQ控制PWM占空比。
图1所示 使用定时器0产生PWM信号
定时器1用于改变定时器0的PWM占空比,因此,改变LED的强度。每隔50毫秒,Timer 1生成一个溢出IRQ,从查找表(LUT)中加载一个新值到T2C0寄存器。
使用公式2计算伽马校正PWM占空比,其中:
T2C0 (γ) =计时器0的伽马校正比较值
T2C0 =计时器0的非伽玛校正比较值
γ=伽马校正因子(即2.5)
count是定时器0上重新加载之间的定时器步数(即10000h-0C000h = 04000h)
offset是Timer 0的重新加载值(例如,0C000h)
例如,Timer 0重新加载值为0C000h时,每次重新加载之间会发生04000h定时器步骤。假设使用32个PWM占空比来增加LED的强度,并基于LUT,则定时器0 (T2C0)的非伽马校正比较值为:
0 0 fa00h0fc00h0fe00h c000h0c200h0c400h……
每个值的差值为0200h,或04000h除以32。使用公式2对上述值进行伽玛校正,得到T2C0的值如下(图2):
0 0 f209h0f676h0fb1dh c000h0c002h0c010h……
附录A中的源代码稍微调整了这些值以消除计时器问题。例如,定时器0在发生IRQ时不会停止。因此,必须小心确保重新加载值不接近比较值(即T2C0 - T2R0 >某个最小正值)。
图2 修正了T2C0
前面提到的PWM占空比值存储在MAXQ2000微控制器程序存储器中的LUT中。虽然将程序内存用于常量和lut可以释放数据内存,但它确实需要更长的访问时间。
Utility ROM功能;moveDP1,用于从程序内存中检索数据(参见MAXQ系列用户指南:MAXQ2000补充)。请注意,由于Utility ROM的未来版本可能不在MAXQ2000的ROM中的同一位置,因此用户应该从存储在地址0800Dh的Utility ROM函数表中加载每个函数的地址。幸运的是,这可以在程序初始化期间完成,并且可以保存函数地址以供稍后在程序中使用。
在附录A中的源代码加载moveDP1实用程序将ROM函数放入A[4]寄存器,并使用这个保存的地址来调用该函数。
使用lut保存预先计算的计算结果可以显著提高固件的执行速度。如果LUT保存在程序内存中,MAXQ2000实用程序ROM函数可以快速访问数据。为了进一步提高固件执行速度,MAXQ2000可以在程序初始化时将LUT数据从程序内存加载到SRAM中。
下载:固件和项目文件(ZIP, 18kB)
下载附录A
社群二维码
关注“华强商城“微信公众号
Copyright 2010-2023 hqbuy.com,Inc.All right reserved. 服务热线:400-830-6691 粤ICP备05106676号 经营许可证:粤B2-20210308