伽玛校正用于校正亮度和亮度之间的非线性关系。本应用笔记给出了为MAXQ2000微控制器(μC)编写的汇编程序,该程序使用伽马校正和固定频率PWM信号线性增加和减少LED的亮度。存储在实用ROM存储器中的查找表(LUT)中的PWM占空比经过伽马校正以产生线性亮度变化。该软件使用免费的MAX-IDE开发工具进行编译,运行在MAXQ2000评估板上。
背景
当LED发光时,伽马校正用于解释亮度和亮度之间的幂律关系。虽然经常互换使用,但亮度和亮度不是同义词。
亮度:发射光,每单位面积投影,单位为cd/m²(坎德拉/米²)。
亮度:人眼赋予的感知亮度。
幂律关系可以近似为:
在此讨论中,γ等于 2.5。
控制发光二极管强度
附录 A 是一个装配程序,它线性地增加和降低 LED 的亮度。强度值已经过伽马校正,以近似亮度的线性变化。
LED 使用 PWM 进行控制。定时器0在P0.0上产生PWM信号(在MAX3评估板上U11的LED2000上可见),并设置为16位重载/比较定时器模式。在此模式下,计时器 0 生成两个中断请求 (IRQ):一个在计时器溢出时,另一个在计时器等于 T2C0 中的比较值时。图1说明了此过程如何产生PWM信号。请注意,溢出 IRQ 控制 PWM 周期,而比较 IRQ 控制 PWM 占空比。
图1.使用定时器 0 生成 PWM 信号。
定时器1用于改变定时器0的PWM占空比,从而改变LED的强度。每 50 毫秒,计时器 1 生成一个溢出 IRQ,将查找表 (LUT) 中的新值加载到 T2C0 寄存器中。
使用公式2计算伽马校正PWM占空比,其中:
T2C0γ = 计时器 0 的伽玛校正比较值
T2C0 = 计时器 0 的非伽马校正比较值
γ = 伽马校正因子(即 2.5)
count 是定时器0上重新加载之间的定时器步数(即,10000h-0C000h = 04000h)
偏移量是计时器 0 重新加载值(即 0C000h)
例如,当计时器 0 重新加载值为 0C000h 时,每次重新加载之间都会发生 04000h 计时器步骤。假设使用 32 个 PWM 占空比来增加 LED 的强度,并且基于 LUT,定时器 0 (T2C0) 的非伽马校正比较值为:
0C000h 0C200h 0C400h ... 0FA00h 0FC00h 0FE00h
每个值之间的差值为 0200h,即 04000h 除以 32。使用公式 2 对上述值进行伽马校正,得出以下 T2C0 值(图 2):
0C000h 0C002h 0C010h ... 0F209h 0F676h 0FB1Dh
附录 A 中的源代码略微调整了这些值,以消除计时器问题。例如,计时器 0 在发生 IRQ 时不会停止。因此,必须注意确保重载值不接近比较值(即,T2C0 - T2R0 >某个最小正值)。
图2.伽玛校正了 T2C0。
使用查找表 (LUT)
前面提到的PWM占空比值存储在MAXQ2000微控制器程序存储器的LUT中。虽然将程序存储器用于常量和LUT可以释放数据存储器,但它确实需要更长的访问时间。
实用程序ROM功能moveDP1用于从程序存储器中检索数据。注意,由于实用程序ROM的未来版本可能不在MAXQ2000的ROM中的同一位置,用户应从存储在地址0800Dh的实用程序ROM功能表中加载每个功能的地址。幸运的是,这可以在程序初始化期间完成,并且可以保存函数地址以供以后在程序中使用。
附录 A 中的源代码将 moveDP1 实用程序 ROM 函数的地址加载到 A[4] 寄存器中,并使用此保存的地址调用该函数。
结论
使用 LUT 保存预先计算的计算结果可以显著提高固件执行速度。如果LUT保存在程序存储器中,MAXQ2000实用程序ROM功能可快速访问数据。为了进一步提高固件执行速度,MAXQ2000可以在程序初始化时将LUT数据从程序存储器加载到SRAM中。
审核编辑:郭婷
全部0条评论
快来发表一下你的评论吧 !