KL25Z Comparator library
Dependents: ComparatorIn_demo TEMT6200_demo 05_comparator_demo 05_comparator_demo ... more
You are viewing an older revision! See the latest version
Homepage
KL25Z Comparator library¶
Comparator features¶
- Operational over the entire supply range
- Inputs may range from rail to rail
- Programmable hysteresis control
- Selectable interrupt on rising-edge, falling-edge, or both rising or falling edges of the comparator output
- Selectable inversion on comparator output
- Capability to produce a wide range of outputs such as:
- Sampled
- Windowed, which is ideal for certain PWM zero-crossing-detection applications
- Digitally filtered:
- Filter can be bypassed
- Can be clocked via external SAMPLE signal or scaled bus clock
- Filter can be bypassed
- Sampled
- External hysteresis can be used at the same time that the output filter is used for internal functions
- Two software selectable performance levels:
- Shorter propagation delay at the expense of higher power
- Low power, with longer propagation delay
- Shorter propagation delay at the expense of higher power
- DMA transfer support not yet implemented in this library
- A comparison event can be selected to trigger a DMA transfer
- A comparison event can be selected to trigger a DMA transfer
- Functional in all modes of operation
- The window and filter functions are not available in the following modes:
- Stop
- VLPS
- LLS
- VLLSx
Block diagram¶
Introduction¶
This library allows us to create comparator objects between different inputs.
The comparator +
and -
inputs can be routed to one out of eight reference inputs (see table).
Input selection
Pin name | # | MUX input | CMP0 | Comment |
---|---|---|---|---|
PTC6 | 000 | IN0 | CMP0_IN0 | |
PTC7 | 001 | IN1 | CMP0_IN1 | |
PTC8 | 010 | IN2 | CMP0_IN2 | |
PTC9 | 011 | IN3 | CMP0_IN3 | |
PTE30 | 100 | IN4 | CMP0_IN4 | 12-bit DAC0 |
PTE29 | 101 | IN5 | CMP0_IN5 | |
110 | IN6 | 1V internal Bandgap* | ||
NC | 111 | IN7 | internal 6-bit DAC0 | |
(table 1) |
* Not yet implemented
Using the library¶
Selecting pins on initialisation
Upon initialisation, the comparator registers are set to following values:
CMP0->CR0 = 0x00; // Filter and digital hysteresis disabled CMP0->CR1 = 0x17; // Continuous mode, high-speed compare, unfiltered output, output pin disabled CMP0->FPR = 0x00; // Filter disabled CMP0->SCR = 0x06; // Disable all interrupts and clear flags (flags are cleared by this write) CMP0->DACCR = 0xE0; // DAC enabled, Vdd is 6bit reference, threshold set to 1/2 of full-scale (1.65V)
The library accepts two input parameters:
example:
ComparatorIn compi(PTC8, NC);
- First parameter :
+
input pin.
- Second parameter :
-
input pin.
Every pin from the 'Pin name' column in (table 1) can be selected.
notes
- IN6 (internal 1V bandgap reference) has no pin name and is not selectable on init.
However, we can use the switch_plus and switch_min functions to change the corresponding input to IN6. - There are two special cases for the input parameters:
NC
: Connect the internal 6-bit DAC0 to IN7.PTE30
: configures PTE30 as 12-bit DAC0 output and connect to IN4.
Example
Following code demonstrates interrupt callback
and polling mode
.
/*********************************************************** CODE EXAMPLE FOR AMBIENT LIGHT SENSOR ON KL25Z + Wi-Go BOARD ***********************************************************/ #include "ComparatorIn.h" #include "mbed.h" DigitalOut blinker(LED_BLUE); DigitalOut cmpled(LED_GREEN); DigitalOut cmp_en (PTD5); AnalogIn cmp_lvl (PTB0); ComparatorIn compi(PTC8, NC); // in+ = PTC8, in- = internal 6-bit DAC // Comparator callback functions void cmp_rise_ISR(void) { cmpled = 0; } void cmp_fall_ISR(void) { cmpled = 1; } int main() { cmp_en = 1; cmpled = 1; compi.rising(&cmp_rise_ISR); // Set pointer to rising interrupt function compi.falling(&cmp_fall_ISR); // Set pointer to falling interrupt function compi.treshold(0.5); // Set comparator threshold to 1.65V = 32 * 3.3V / 64 compi.int_en(1); // Enable comparator interrupts while(1) { printf("Light sensor : %7.5f Volt\n",cmp_lvl*3.3); blinker = 1; wait(1); blinker = 0; wait(0.2); if (compi.status() == 0x01) { printf("*** Treshold reached : %7.5f\n",cmp_lvl*3.3); } } }
Notes
- When we enable the comparator interrupt, we need to declare user callback function(s) (rising and/or falling interrupt) AND initialise the function pointer(s).
example:
compi.rising(&cmp_rise_ISR); compi.falling(&cmp_fall_ISR);
- Currently, following functions are not yet implemented:
- On the fly MUX switching for
+
input (switch_plus function). - On the fly MUX switching for
-
input (switch_min function). - DMA transfer.
- On the fly MUX switching for