1

Dependencies:   mbed freq_counter

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?

UserRevisionLine numberNew 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 **/