差别
这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
三色灯颜色和亮度控制 [2016/06/22 13:57] anran [知识点] |
三色灯颜色和亮度控制 [2016/06/29 16:34] (当前版本) anran [仿真结果] |
||
---|---|---|---|
行 13: | 行 13: | ||
====工作原理==== | ====工作原理==== | ||
------ | ------ | ||
- | 这里三色灯是由光学三基色(红绿蓝)三种颜色的LED灯组合而成。 | + | 这里三色灯是在一个物理封装里面,有R(红)、G(绿)、B(兰)三种颜色的LED灯,这三个灯非常靠近,从远处看可以当作一个三色的发光点。 |
{{ :三基色合成.jpg |三基色合成}} | {{ :三基色合成.jpg |三基色合成}} | ||
- | 根据红绿蓝三色的不同组合可以合成不同颜色的光,例如红色和绿色组合可以产生黄色的光,绿色和蓝色组合可以产生青色的光,相同颜色不同亮度组合也会产生不同的光等等,如图。 | + | 根据红、绿、蓝三色的不同组合可以合成不同颜色的光,例如红色和绿色组合可以产生黄色的光,绿色和蓝色组合可以产生青色的光,相同颜色不同亮度组合也会产生不同的光等等,如图。 |
本实验中我们实现三基色的固定组合,最终输出产生图中的红色、绿色、蓝色、黄色、青色、品红、白色7中颜色,然后根据PWM的原理调节LED灯颜色的亮度,使用PWM,给LED灯上施加数字信号,通过调整数字信号的占空比(调整占空比 = 调整有效值)来控制LED灯的亮度。 | 本实验中我们实现三基色的固定组合,最终输出产生图中的红色、绿色、蓝色、黄色、青色、品红、白色7中颜色,然后根据PWM的原理调节LED灯颜色的亮度,使用PWM,给LED灯上施加数字信号,通过调整数字信号的占空比(调整占空比 = 调整有效值)来控制LED灯的亮度。 | ||
行 34: | 行 34: | ||
{{ ::rgb_led.jpg |RGB三色灯硬件连接}} | {{ ::rgb_led.jpg |RGB三色灯硬件连接}} | ||
+ | |||
+ | 注意:R、G、B三种颜色的LED的限流电阻的阻值是不同的,主要是因为达到同样的亮度,每种颜色的LED灯所需要的电流是不同的。 | ||
+ | |||
+ | 小脚丫开发板上有两组RGB三色灯,在本实验中我们采用其中的一组做实验。 | ||
====代码设计==== | ====代码设计==== | ||
行 57: | 行 61: | ||
<code verilog> | <code verilog> | ||
- | //Debounce for key_color | + | //Debounce for key |
- | Debounce Debounce_color(.clk(clk_in),.rst_n(rst_n_in),.key_n(key_color),.key_pulse(color_pulse)); | + | wire [2:0] key_pulse; |
+ | Debounce1 Debounce_uut | ||
+ | ( | ||
+ | .clk(clk_in), | ||
+ | .rst_n(rst_n_in), | ||
+ | .key_n({key_color,key_up,key_down}), | ||
+ | .key_pulse(key_pulse) | ||
+ | ); | ||
- | //Debounce for key_up | + | wire color_pulse = key_pulse[2]; |
- | Debounce Debounce_up(.clk(clk_in),.rst_n(rst_n_in),.key_n(key_up),.key_pulse(up_pulse)); | + | wire up_pulse = key_pulse[1]; |
- | + | wire down_pulse = key_pulse[0]; | |
- | //Debounce for key_down | + | |
- | Debounce Debounce_down(.clk(clk_in),.rst_n(rst_n_in),.key_n(key_down),.key_pulse(down_pulse)); | + | |
</code> | </code> | ||
行 91: | 行 100: | ||
</code> | </code> | ||
- | 调用PWM功能模块,实现亮度的调节,具体原理见[[脉冲发生器]]和[呼吸灯]]实验,产生PWM信号Lightness_out,然后根据PWM控制亮度,如下: | + | 调用PWM功能模块,实现亮度的调节,具体原理见[[脉冲发生器]]和[[呼吸灯]]实验,为了保证三色灯在单色(红、绿、蓝)、双色合成(黄、青、品红)和三色合成(白)之间切换时亮度相同,单色切换为双色合成色时,需要将双色合成时每种基色的亮度减半,单色切换为三色合成色时需要将三色合成时每种基色亮度降为33%,亮度与占空比相关。例如红色时我们调节控制信号占空比为60%,输出黄色时其中的红色和绿色的控制信号占空比都为30%,输出白色时其中的红绿蓝三色的控制信号占空比都为20%,使用脉宽不变,改变脉冲周期的方法实现 |
+ | |||
+ | <code verilog> | ||
+ | localparam CYCLE_ONE = 5; | ||
+ | localparam CYCLE_TWO = 10; | ||
+ | localparam CYCLE_THREE = 15; | ||
+ | |||
+ | reg [3:0] cycle; | ||
+ | //Control duty cycle | ||
+ | always @(color) begin | ||
+ | case(color) | ||
+ | 3'b110: cycle = CYCLE_ONE; | ||
+ | 3'b101: cycle = CYCLE_ONE; | ||
+ | 3'b011: cycle = CYCLE_ONE; | ||
+ | 3'b100: cycle = CYCLE_TWO; | ||
+ | 3'b010: cycle = CYCLE_TWO; | ||
+ | 3'b001: cycle = CYCLE_TWO; | ||
+ | 3'b000: cycle = CYCLE_THREE; | ||
+ | 3'b111: cycle = CYCLE_THREE; | ||
+ | default: cycle = CYCLE_ONE; | ||
+ | endcase | ||
+ | end | ||
+ | </code> | ||
+ | |||
+ | 我们采用产生PWM信号Lightness_out,然后根据PWM控制亮度,如下: | ||
<code verilog> | <code verilog> | ||
行 105: | 行 138: | ||
====仿真结果==== | ====仿真结果==== | ||
- | {{:呼吸灯仿真.jpg|呼吸灯仿真}} | + | {{:红色.jpg?180 |红色}} |
+ | |||
+ | {{:绿色.jpg?180 |绿色}} | ||
+ | |||
+ | {{:蓝色.jpg?180 |蓝色}} | ||
+ | |||
+ | {{:黄色.jpg?180 |黄色}} | ||
+ | |||
+ | {{:青色.jpg?180 |青色}} | ||
+ | |||
+ | {{:品红.jpg?180 |品红}} | ||
+ | |||
+ | {{:白色.jpg?180|白色}} | ||
====资源报告==== | ====资源报告==== | ||
^ 资源 | 数量 | 比例 | 说明 | | ^ 资源 | 数量 | 比例 | 说明 | | ||
- | ^ LUTs | 59 | 3% | | | + | ^ LUTs | 77 | 2% | | |
- | ^ 寄存器 | 78 | 2% | | | + | ^ 寄存器 | 43 | 1% | | |
^ 存储器 | 0 | 0% | | | ^ 存储器 | 0 | 0% | | | ||
^ IO管脚 | 8 | | | | ^ IO管脚 | 8 | | | | ||
行 123: | 行 168: | ||
====参考文档==== | ====参考文档==== | ||
+ | * [[按键消抖]] | ||
* [[脉冲发生器]] | * [[脉冲发生器]] | ||
* {{:machxo2familydatasheet.pdf|Lattice MachXO2数据手册}} | * {{:machxo2familydatasheet.pdf|Lattice MachXO2数据手册}} | ||
- | |||
====相关文档==== | ====相关文档==== | ||
^ **文件名称** | **功能** | | ^ **文件名称** | **功能** | | ||
- | ^ **[[Breath_led.v]]** | **呼吸灯** | | + | ^ **[[Color_led.v]]** | **三色灯,顶层模块** | |
- | ^ **[[Breath_led_test.v]]** | **测试文件** | | + | ^ **[[Debounce1.v]]** | **按键消抖模块** | |
+ | ^ **[[Lightness.v]]** | **PWM亮度调节模块** | |