1
Dependencies: mbed freq_counter
main.cpp@1:5bb7cf57b763, 2021-03-07 (annotated)
- Committer:
- sunghunKim
- Date:
- Sun Mar 07 11:59:28 2021 +0000
- Revision:
- 1:5bb7cf57b763
- Parent:
- 0:8a21ee76eb7d
wind speed
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sunghunKim | 1:5bb7cf57b763 | 1 | /* |
sunghunKim | 1:5bb7cf57b763 | 2 | * mbed Application program / Frequency Counter |
sunghunKim | 1:5bb7cf57b763 | 3 | * |
sunghunKim | 1:5bb7cf57b763 | 4 | * Copyright (c) 2014,'15,'20 Kenji Arai / JH1PJL |
sunghunKim | 1:5bb7cf57b763 | 5 | * http://www7b.biglobe.ne.jp/~kenjia/ |
sunghunKim | 1:5bb7cf57b763 | 6 | * https://os.mbed.com/users/kenjiArai/ |
sunghunKim | 1:5bb7cf57b763 | 7 | * Created: October 18th, 2014 |
sunghunKim | 1:5bb7cf57b763 | 8 | * Revised: August 4th, 2020 |
sunghunKim | 1:5bb7cf57b763 | 9 | */ |
sunghunKim | 1:5bb7cf57b763 | 10 | |
sunghunKim | 1:5bb7cf57b763 | 11 | //#define USE_TEXT_LCD // use Text LCD/I2C Interface |
sunghunKim | 1:5bb7cf57b763 | 12 | |
sunghunKim | 0:8a21ee76eb7d | 13 | #include "mbed.h" |
sunghunKim | 1:5bb7cf57b763 | 14 | #include "freq_counter.h" |
sunghunKim | 1:5bb7cf57b763 | 15 | |
sunghunKim | 1:5bb7cf57b763 | 16 | #define GATE_TIME_10SEC 10000000 |
sunghunKim | 1:5bb7cf57b763 | 17 | #define GATE_TIME_1SEC 1000000 |
sunghunKim | 1:5bb7cf57b763 | 18 | #define GATE_TIME_100MS 100000 |
sunghunKim | 1:5bb7cf57b763 | 19 | #define GATE_TIME_10MS 10000 |
sunghunKim | 1:5bb7cf57b763 | 20 | |
sunghunKim | 1:5bb7cf57b763 | 21 | #define GATE_TIME GATE_TIME_1SEC |
sunghunKim | 1:5bb7cf57b763 | 22 | |
sunghunKim | 1:5bb7cf57b763 | 23 | //extern void print_revision(void); |
sunghunKim | 1:5bb7cf57b763 | 24 | |
sunghunKim | 1:5bb7cf57b763 | 25 | // LPC1768 --------------------------------------------------------------------- |
sunghunKim | 1:5bb7cf57b763 | 26 | //#if defined(TARGET_LPC1768) |
sunghunKim | 0:8a21ee76eb7d | 27 | |
sunghunKim | 1:5bb7cf57b763 | 28 | // LPC1768 Frequency example |
sunghunKim | 1:5bb7cf57b763 | 29 | // Ref Clock output -> "PWM6" pin to 96MHZ/19 = 5.052MHz (Approx) |
sunghunKim | 1:5bb7cf57b763 | 30 | # define CLK_REFRENCE() PWM6_SETCLK(19) |
sunghunKim | 1:5bb7cf57b763 | 31 | // Outout mbed's "PWM6" pin to 96MHZ/96 = 1.000MHz (Approx) |
sunghunKim | 1:5bb7cf57b763 | 32 | //#define CLK_REFRENCE() PWM6_SETCLK(96) |
sunghunKim | 1:5bb7cf57b763 | 33 | |
sunghunKim | 1:5bb7cf57b763 | 34 | //DigitalOut led_gate(LED1); |
sunghunKim | 1:5bb7cf57b763 | 35 | //I2C i2cBus(p9, p10); // SDA, SCL |
sunghunKim | 1:5bb7cf57b763 | 36 | PwmOut fmclck(p21); // for RESERVE pin21 as PWM1[6] |
sunghunKim | 1:5bb7cf57b763 | 37 | F_COUNTER fc(p30); |
sunghunKim | 1:5bb7cf57b763 | 38 | |
sunghunKim | 1:5bb7cf57b763 | 39 | void PWM6_SETCLK(int div); |
sunghunKim | 1:5bb7cf57b763 | 40 | |
sunghunKim | 1:5bb7cf57b763 | 41 | /** |
sunghunKim | 1:5bb7cf57b763 | 42 | // LPC1114 --------------------------------------------------------------------- |
sunghunKim | 1:5bb7cf57b763 | 43 | #elif defined(TARGET_LPC1114) |
sunghunKim | 1:5bb7cf57b763 | 44 | |
sunghunKim | 1:5bb7cf57b763 | 45 | // LPC1114 Frequency example |
sunghunKim | 1:5bb7cf57b763 | 46 | // Ref Clock output -> "dp24" pin as CLOCKOUT |
sunghunKim | 1:5bb7cf57b763 | 47 | |
sunghunKim | 1:5bb7cf57b763 | 48 | DigitalOut led_gate(LED2); |
sunghunKim | 1:5bb7cf57b763 | 49 | I2C i2cBus(dp5,dp27); // SDA, SCL |
sunghunKim | 1:5bb7cf57b763 | 50 | F_COUNTER fc(dp14); |
sunghunKim | 1:5bb7cf57b763 | 51 | |
sunghunKim | 1:5bb7cf57b763 | 52 | void clock_out(void); |
sunghunKim | 1:5bb7cf57b763 | 53 | # define CLK_REFRENCE() clock_out() |
sunghunKim | 1:5bb7cf57b763 | 54 | # warning "Don't forget LPC1114 runs with internal clock." |
sunghunKim | 1:5bb7cf57b763 | 55 | # warning "Measurement data is not accurate!!" |
sunghunKim | 0:8a21ee76eb7d | 56 | |
sunghunKim | 1:5bb7cf57b763 | 57 | // STM32 / Nucleo -------------------------------------------------------------- |
sunghunKim | 1:5bb7cf57b763 | 58 | #elif defined(TARGET_NUCLEO_F401RE)\ |
sunghunKim | 1:5bb7cf57b763 | 59 | || defined(TARGET_NUCLEO_F411RE)\ |
sunghunKim | 1:5bb7cf57b763 | 60 | || defined(TARGET_NUCLEO_F446RE) |
sunghunKim | 1:5bb7cf57b763 | 61 | |
sunghunKim | 1:5bb7cf57b763 | 62 | // STM32 Frequency example |
sunghunKim | 1:5bb7cf57b763 | 63 | // Ref Clock output -> "PC_9" pin as MCO2 System clock / 4 |
sunghunKim | 1:5bb7cf57b763 | 64 | |
sunghunKim | 1:5bb7cf57b763 | 65 | DigitalOut led_gate(LED1); |
sunghunKim | 1:5bb7cf57b763 | 66 | I2C i2cBus(PB_9,PB_8); // SDA, SCL |
sunghunKim | 1:5bb7cf57b763 | 67 | F_COUNTER fc(PA_0); |
sunghunKim | 1:5bb7cf57b763 | 68 | |
sunghunKim | 1:5bb7cf57b763 | 69 | void port_mco2_set(void); |
sunghunKim | 1:5bb7cf57b763 | 70 | # define CLK_REFRENCE() port_mco2_set() |
sunghunKim | 1:5bb7cf57b763 | 71 | |
sunghunKim | 1:5bb7cf57b763 | 72 | // Other CPU's ----------------------------------------------------------------- |
sunghunKim | 1:5bb7cf57b763 | 73 | #else |
sunghunKim | 1:5bb7cf57b763 | 74 | # error "No support for your CPU" |
sunghunKim | 1:5bb7cf57b763 | 75 | #endif |
sunghunKim | 1:5bb7cf57b763 | 76 | |
sunghunKim | 1:5bb7cf57b763 | 77 | // Only for LCD control ------------------------------------------------------- |
sunghunKim | 1:5bb7cf57b763 | 78 | #if defined(USE_TEXT_LCD) |
sunghunKim | 1:5bb7cf57b763 | 79 | #include "TextLCD.h" // Std. lib./ LCD control |
sunghunKim | 1:5bb7cf57b763 | 80 | // LCD(Akizuki AQM0802A) |
sunghunKim | 1:5bb7cf57b763 | 81 | TextLCD_I2C_N lcd(&i2cBus, 0x7c, TextLCD::LCD8x2); |
sunghunKim | 1:5bb7cf57b763 | 82 | void lcd_onotialize(void); |
sunghunKim | 1:5bb7cf57b763 | 83 | void display_on_lcd(float freqency, uint32_t t_gate); |
sunghunKim | 1:5bb7cf57b763 | 84 | # define LCD_INITIALIZE() lcd_onotialize() |
sunghunKim | 1:5bb7cf57b763 | 85 | # define DISPLAY_ON_LCD(x,y) display_on_lcd(x,y) |
sunghunKim | 1:5bb7cf57b763 | 86 | #else |
sunghunKim | 1:5bb7cf57b763 | 87 | # define LCD_INITIALIZE() {;} |
sunghunKim | 1:5bb7cf57b763 | 88 | # define DISPLAY_ON_LCD(x,y) {;} |
sunghunKim | 1:5bb7cf57b763 | 89 | #endif |
sunghunKim | 1:5bb7cf57b763 | 90 | **/ |
sunghunKim | 1:5bb7cf57b763 | 91 | //------------------------------------------------------------------------------ |
sunghunKim | 1:5bb7cf57b763 | 92 | // Control Program |
sunghunKim | 1:5bb7cf57b763 | 93 | //------------------------------------------------------------------------------ |
sunghunKim | 1:5bb7cf57b763 | 94 | int main() |
sunghunKim | 1:5bb7cf57b763 | 95 | { |
sunghunKim | 1:5bb7cf57b763 | 96 | float freqency; |
sunghunKim | 1:5bb7cf57b763 | 97 | uint32_t t_gate; |
sunghunKim | 1:5bb7cf57b763 | 98 | |
sunghunKim | 1:5bb7cf57b763 | 99 | // print_revision(); |
sunghunKim | 1:5bb7cf57b763 | 100 | printf("\r\nFrequency Counter by JH1PJL created on " __DATE__ "\r\n"); |
sunghunKim | 1:5bb7cf57b763 | 101 | // lcd |
sunghunKim | 1:5bb7cf57b763 | 102 | // LCD_INITIALIZE(); |
sunghunKim | 1:5bb7cf57b763 | 103 | // Set Internalclock for reference |
sunghunKim | 1:5bb7cf57b763 | 104 | CLK_REFRENCE(); |
sunghunKim | 1:5bb7cf57b763 | 105 | while(true) { |
sunghunKim | 1:5bb7cf57b763 | 106 | // led_gate = 1; |
sunghunKim | 1:5bb7cf57b763 | 107 | t_gate = GATE_TIME; |
sunghunKim | 1:5bb7cf57b763 | 108 | freqency = (float)fc.read_frequency(t_gate); |
sunghunKim | 1:5bb7cf57b763 | 109 | // led_gate = 0; |
sunghunKim | 1:5bb7cf57b763 | 110 | // printf("f= %9.0f [Hz], gate= %4.3f [Sec]\r\n", freqency, (float)t_gate / 1e6); |
sunghunKim | 1:5bb7cf57b763 | 111 | printf("f= %9.0f [Hz], wind_speed= %f\n", freqency, (0.062 *freqency) + 0.578); |
sunghunKim | 1:5bb7cf57b763 | 112 | // DISPLAY_ON_LCD(freqency, t_gate); |
sunghunKim | 0:8a21ee76eb7d | 113 | } |
sunghunKim | 0:8a21ee76eb7d | 114 | } |
sunghunKim | 1:5bb7cf57b763 | 115 | |
sunghunKim | 1:5bb7cf57b763 | 116 | #if defined(TARGET_LPC1768) |
sunghunKim | 1:5bb7cf57b763 | 117 | |
sunghunKim | 1:5bb7cf57b763 | 118 | // Clock Output From pin21(PWM6) |
sunghunKim | 1:5bb7cf57b763 | 119 | // Set Clock Freq with div. |
sunghunKim | 1:5bb7cf57b763 | 120 | // if mbed is running at 96MHz, div is set 96 to Get 1MHz. |
sunghunKim | 1:5bb7cf57b763 | 121 | void PWM6_SETCLK(int div) |
sunghunKim | 1:5bb7cf57b763 | 122 | { |
sunghunKim | 1:5bb7cf57b763 | 123 | // 1)Reset counter, disable PWM |
sunghunKim | 1:5bb7cf57b763 | 124 | LPC_PWM1->TCR = (1 << 1); |
sunghunKim | 1:5bb7cf57b763 | 125 | LPC_SC->PCLKSEL0 &= ~(0x3 << 12); |
sunghunKim | 1:5bb7cf57b763 | 126 | // 2)Set peripheral clock divider to /1, i.e. system clock |
sunghunKim | 1:5bb7cf57b763 | 127 | LPC_SC->PCLKSEL0 |= (1 << 12); |
sunghunKim | 1:5bb7cf57b763 | 128 | // 3)Match Register 0 is shared period counter for all PWM1 |
sunghunKim | 1:5bb7cf57b763 | 129 | LPC_PWM1->MR0 = div - 1; |
sunghunKim | 1:5bb7cf57b763 | 130 | LPC_PWM1->MR6 = (div + 1)>> 1; |
sunghunKim | 1:5bb7cf57b763 | 131 | // 4)Start updating at next period start |
sunghunKim | 1:5bb7cf57b763 | 132 | LPC_PWM1->LER |= 1; |
sunghunKim | 1:5bb7cf57b763 | 133 | // 5)Enable counter and PWM |
sunghunKim | 1:5bb7cf57b763 | 134 | LPC_PWM1->TCR = (1 << 0) + (1 << 3); |
sunghunKim | 1:5bb7cf57b763 | 135 | printf("Set pin21(PWM6) for clock output\r\n"); |
sunghunKim | 1:5bb7cf57b763 | 136 | } |
sunghunKim | 1:5bb7cf57b763 | 137 | |
sunghunKim | 1:5bb7cf57b763 | 138 | #elif defined(TARGET_LPC1114) |
sunghunKim | 1:5bb7cf57b763 | 139 | |
sunghunKim | 1:5bb7cf57b763 | 140 | // CLOCKOUT from pin24(dp18) |
sunghunKim | 1:5bb7cf57b763 | 141 | // Freq = 48MHz/4 = 12MHz |
sunghunKim | 1:5bb7cf57b763 | 142 | void clock_out(void) |
sunghunKim | 1:5bb7cf57b763 | 143 | { |
sunghunKim | 1:5bb7cf57b763 | 144 | LPC_SYSCON->CLKOUTCLKSEL = 3; // System clock |
sunghunKim | 1:5bb7cf57b763 | 145 | LPC_SYSCON->CLKOUTDIV = 4; // div 1/4 |
sunghunKim | 1:5bb7cf57b763 | 146 | LPC_IOCON->PIO0_1 = 1; // select CLKOUT to P0_1(pin24)/dp18 |
sunghunKim | 1:5bb7cf57b763 | 147 | LPC_SYSCON->CLKOUTUEN = 1; // enable output |
sunghunKim | 1:5bb7cf57b763 | 148 | printf("Set P0_1(pin24)/dp18 for clock output\r\n"); |
sunghunKim | 1:5bb7cf57b763 | 149 | } |
sunghunKim | 1:5bb7cf57b763 | 150 | |
sunghunKim | 1:5bb7cf57b763 | 151 | #elif defined(TARGET_NUCLEO_F401RE)\ |
sunghunKim | 1:5bb7cf57b763 | 152 | || defined(TARGET_NUCLEO_F411RE)\ |
sunghunKim | 1:5bb7cf57b763 | 153 | || defined(TARGET_NUCLEO_F446RE) |
sunghunKim | 1:5bb7cf57b763 | 154 | |
sunghunKim | 1:5bb7cf57b763 | 155 | void port_mco2_set(void) |
sunghunKim | 1:5bb7cf57b763 | 156 | { |
sunghunKim | 1:5bb7cf57b763 | 157 | // PC9 -> MCO_2 |
sunghunKim | 1:5bb7cf57b763 | 158 | DigitalOut dumy1(PC_9); |
sunghunKim | 1:5bb7cf57b763 | 159 | uint32_t temp = |
sunghunKim | 1:5bb7cf57b763 | 160 | ((uint32_t)(GPIO_AF0_MCO) << (((uint32_t)9 & (uint32_t)0x07) * 4)) ; |
sunghunKim | 1:5bb7cf57b763 | 161 | GPIOC->AFR[9 >> 3] &= |
sunghunKim | 1:5bb7cf57b763 | 162 | ~((uint32_t)0xf << ((uint32_t)(9 & (uint32_t)0x07) * 4)) ; |
sunghunKim | 1:5bb7cf57b763 | 163 | GPIOC->AFR[9 >> 3] |= temp; |
sunghunKim | 1:5bb7cf57b763 | 164 | GPIOC->MODER &= ~(GPIO_MODER_MODER0 << (9 * 2)); |
sunghunKim | 1:5bb7cf57b763 | 165 | GPIOC->MODER |= (0x2 << (9 * 2)); |
sunghunKim | 1:5bb7cf57b763 | 166 | GPIOC->OSPEEDR |= (0x03 << (9 * 2)); // High speed |
sunghunKim | 1:5bb7cf57b763 | 167 | // Select output clock source |
sunghunKim | 1:5bb7cf57b763 | 168 | RCC->CFGR &= 0x009fffff; |
sunghunKim | 1:5bb7cf57b763 | 169 | // MCO_2 output SYSCLK 1/4 |
sunghunKim | 1:5bb7cf57b763 | 170 | // MCO2 MCO2PRE |
sunghunKim | 1:5bb7cf57b763 | 171 | RCC->CFGR |= (0x0 << 30) + (0x6 << 27); |
sunghunKim | 1:5bb7cf57b763 | 172 | printf("Set PC9 for clock output\r\n"); |
sunghunKim | 1:5bb7cf57b763 | 173 | } |
sunghunKim | 1:5bb7cf57b763 | 174 | |
sunghunKim | 1:5bb7cf57b763 | 175 | #else |
sunghunKim | 1:5bb7cf57b763 | 176 | # error "No support for your CPU" |
sunghunKim | 1:5bb7cf57b763 | 177 | #endif |
sunghunKim | 1:5bb7cf57b763 | 178 | |
sunghunKim | 1:5bb7cf57b763 | 179 | |
sunghunKim | 1:5bb7cf57b763 | 180 | /** |
sunghunKim | 1:5bb7cf57b763 | 181 | #if defined(USE_TEXT_LCD) |
sunghunKim | 1:5bb7cf57b763 | 182 | void lcd_onotialize(void) |
sunghunKim | 1:5bb7cf57b763 | 183 | { |
sunghunKim | 1:5bb7cf57b763 | 184 | // Initialize LCD |
sunghunKim | 1:5bb7cf57b763 | 185 | lcd.locate(0, 0); // 1st line top |
sunghunKim | 1:5bb7cf57b763 | 186 | // 12345678 |
sunghunKim | 1:5bb7cf57b763 | 187 | lcd.printf("Fre-Cntr"); |
sunghunKim | 1:5bb7cf57b763 | 188 | lcd.locate(0, 1); // 2nd line top |
sunghunKim | 1:5bb7cf57b763 | 189 | // 12345678 |
sunghunKim | 1:5bb7cf57b763 | 190 | lcd.puts(" JH1PJL "); |
sunghunKim | 1:5bb7cf57b763 | 191 | lcd.setCursor(TextLCD::CurOff_BlkOff); |
sunghunKim | 1:5bb7cf57b763 | 192 | lcd.setContrast(0x16); |
sunghunKim | 1:5bb7cf57b763 | 193 | thread_sleep_for(5000); |
sunghunKim | 1:5bb7cf57b763 | 194 | lcd.locate(0, 1); // 2nd line top |
sunghunKim | 1:5bb7cf57b763 | 195 | // 12345678 |
sunghunKim | 1:5bb7cf57b763 | 196 | lcd.puts(" "); |
sunghunKim | 1:5bb7cf57b763 | 197 | } |
sunghunKim | 1:5bb7cf57b763 | 198 | |
sunghunKim | 1:5bb7cf57b763 | 199 | void display_on_lcd(float freqency, uint32_t t_gate) |
sunghunKim | 1:5bb7cf57b763 | 200 | { |
sunghunKim | 1:5bb7cf57b763 | 201 | lcd.locate(0, 0); // 1st line top |
sunghunKim | 1:5bb7cf57b763 | 202 | lcd.printf("%8.0f", freqency); |
sunghunKim | 1:5bb7cf57b763 | 203 | lcd.locate(0, 1); // 2nd line top |
sunghunKim | 1:5bb7cf57b763 | 204 | switch (t_gate) { |
sunghunKim | 1:5bb7cf57b763 | 205 | case GATE_TIME_10SEC: |
sunghunKim | 1:5bb7cf57b763 | 206 | // 12345678 |
sunghunKim | 1:5bb7cf57b763 | 207 | lcd.printf("Hz x0.1"); |
sunghunKim | 1:5bb7cf57b763 | 208 | break; |
sunghunKim | 1:5bb7cf57b763 | 209 | case GATE_TIME_1SEC: |
sunghunKim | 1:5bb7cf57b763 | 210 | // 12345678 |
sunghunKim | 1:5bb7cf57b763 | 211 | lcd.printf("Hz x1"); |
sunghunKim | 1:5bb7cf57b763 | 212 | break; |
sunghunKim | 1:5bb7cf57b763 | 213 | case GATE_TIME_100MS: |
sunghunKim | 1:5bb7cf57b763 | 214 | // 12345678 |
sunghunKim | 1:5bb7cf57b763 | 215 | lcd.printf("Hz x10"); |
sunghunKim | 1:5bb7cf57b763 | 216 | break; |
sunghunKim | 1:5bb7cf57b763 | 217 | case GATE_TIME_10MS: |
sunghunKim | 1:5bb7cf57b763 | 218 | // 12345678 |
sunghunKim | 1:5bb7cf57b763 | 219 | lcd.printf("Hz x100"); |
sunghunKim | 1:5bb7cf57b763 | 220 | break; |
sunghunKim | 1:5bb7cf57b763 | 221 | default: |
sunghunKim | 1:5bb7cf57b763 | 222 | // 12345678 |
sunghunKim | 1:5bb7cf57b763 | 223 | lcd.printf("Hz gate?"); |
sunghunKim | 1:5bb7cf57b763 | 224 | break; |
sunghunKim | 1:5bb7cf57b763 | 225 | } |
sunghunKim | 1:5bb7cf57b763 | 226 | } |
sunghunKim | 1:5bb7cf57b763 | 227 | #endif |
sunghunKim | 1:5bb7cf57b763 | 228 | **/ |