From 64b232c87808fd2016831604f42cee9d30e10d8b Mon Sep 17 00:00:00 2001 From: Jacob Alexander Date: Sat, 1 Aug 2015 21:59:43 -0700 Subject: [PATCH] Adding 16-bit brightness control to LCD backlight --- Scan/STLcd/capabilities.kll | 44 ++++++++++++++++++++++++++++++ Scan/STLcd/lcd_scan.c | 54 ++++++++++++++++++++++++++++++------- 2 files changed, 88 insertions(+), 10 deletions(-) create mode 100644 Scan/STLcd/capabilities.kll diff --git a/Scan/STLcd/capabilities.kll b/Scan/STLcd/capabilities.kll new file mode 100644 index 0000000..a327bc2 --- /dev/null +++ b/Scan/STLcd/capabilities.kll @@ -0,0 +1,44 @@ +Name = STLcdCapabilities; +Version = 0.1; +Author = "HaaTa (Jacob Alexander) 2015"; +KLL = 0.3c; + +# Modified Date +Date = 2015-08-01; + +# Defines available to the STLcd sub-module + +# PWM Prescalar +# In general this can be left alone +# A higher prescalar should be lower power usage (less switching) +# However, flickering may be noticeable. +# +# Here's a calculation table valid at a 72 MHz system clock +# Prescalars range from 0 to 7 (1 to 128) +# 0 - 72 MHz - Highest power usage/best result +# 1 - 36 MHz +# 2 - 18 MHz +# 3 - 9 MHz - Slightly visible flicker (peripheral vision) +# 4 - 4 500 kHz - Visible flickering +# 5 - 2 250 kHz +# 6 - 1 125 kHz +# 7 - 562 500 Hz +# Defaulting to no prescalar, looks the best +STLcdBacklightPrescalar => STLcdBacklightPrescalar_define; +STLcdBacklightPrescalar = 0; + +# Default Backlight Channel Brightness +# There are 3 channels, RGB +# In order to get other colors you must mix the 3 colors +# Each channel is a 16-bit register (65536 levels) +# Technically, this means, the backlight is a 48-bit RGB pixel +# In practice, it may be difficult to get color consistency at times if too bright or too dim +STLcdBacklightRed => STLcdBacklightRed_define; +STLcdBacklightGreen => STLcdBacklightGreen_define; +STLcdBacklightBlue => STLcdBacklightBlue_define; + +# Defaults to 6% brightness, white +STLcdBacklightRed = 0xFFF; +STLcdBacklightGreen = 0xFFF; +STLcdBacklightBlue = 0xFFF; + diff --git a/Scan/STLcd/lcd_scan.c b/Scan/STLcd/lcd_scan.c index df07b5a..49a1b82 100644 --- a/Scan/STLcd/lcd_scan.c +++ b/Scan/STLcd/lcd_scan.c @@ -21,6 +21,7 @@ // Project Includes #include +#include #include #include @@ -276,16 +277,49 @@ inline void LCD_setup() // Setup Backlight // TODO Expose default settings - // TODO Setup PWM - GPIOC_PDDR |= (1<<1); - PORTC_PCR1 = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(1); - GPIOC_PCOR |= (1<<1); - GPIOC_PDDR |= (1<<2); - PORTC_PCR2 = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(1); - GPIOC_PCOR |= (1<<2); - GPIOC_PDDR |= (1<<3); - PORTC_PCR3 = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(1); - GPIOC_PCOR |= (1<<3); + SIM_SCGC6 |= SIM_SCGC6_FTM0; + FTM0_CNT = 0; // Reset counter + + // PWM Period + // 16-bit maximum + FTM0_MOD = 0xFFFF; + + // Set FTM to PWM output - Edge Aligned, Low-true pulses + FTM0_C0SC = 0x24; // MSnB:MSnA = 10, ELSnB:ELSnA = 01 + FTM0_C1SC = 0x24; + FTM0_C2SC = 0x24; + + // Base FTM clock selection (72 MHz system clock) + // Pre-scalar calculations + // 0 - 72 MHz - Highest power usage/best result + // 1 - 36 MHz + // 2 - 18 MHz + // 3 - 9 MHz - Slightly visible flicker (peripheral vision) + // 4 - 4 500 kHz - Visible flickering + // 5 - 2 250 kHz + // 6 - 1 125 kHz + // 7 - 562 500 Hz + // System clock, /w prescalar setting + FTM0_SC = FTM_SC_CLKS(1) | FTM_SC_PS( STLcdBacklightPrescalar_define ); + + /* Write frequency TODO API + FTM0_SC = 0; + FTM0_CNT = 0; + FTM0_MOD = mod; + FTM0_SC = FTM_SC_CLKS(1) | FTM_SC_PS(prescale); + */ + + // Red + FTM0_C0V = STLcdBacklightRed_define; + PORTC_PCR1 = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(4); + + // Green + FTM0_C1V = STLcdBacklightGreen_define; + PORTC_PCR2 = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(4); + + // Blue + FTM0_C2V = STLcdBacklightBlue_define; + PORTC_PCR3 = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(4); }