Browse Source

Adding 16-bit brightness control to LCD backlight

connect
Jacob Alexander 8 years ago
parent
commit
64b232c878
2 changed files with 88 additions and 10 deletions
  1. 44
    0
      Scan/STLcd/capabilities.kll
  2. 44
    10
      Scan/STLcd/lcd_scan.c

+ 44
- 0
Scan/STLcd/capabilities.kll View File

@@ -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;


+ 44
- 10
Scan/STLcd/lcd_scan.c View File

@@ -21,6 +21,7 @@

// Project Includes
#include <cli.h>
#include <kll.h>
#include <led.h>
#include <print.h>

@@ -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);
}