preparations for changing gps library

This commit is contained in:
Klaus K Wilting 2019-02-09 13:02:38 +01:00
parent ed5c7f46f3
commit fde157dd0d
8 changed files with 73 additions and 17 deletions

View File

@ -16,5 +16,6 @@ int gps_init(void);
void gps_read(void);
void gps_loop(void *pvParameters);
time_t get_gpstime(void);
int gps_config();
#endif

View File

@ -15,8 +15,8 @@
;env_default = ttgov2
;env_default = ttgov21old
;env_default = ttgov21new
env_default = ttgobeam
;env_default = ttgofox
;env_default = ttgobeam
env_default = ttgofox
;env_default = lopy
;env_default = lopy4
;env_default = fipy
@ -50,6 +50,7 @@ lib_deps_rgbled =
SmartLeds@>=1.1.5
lib_deps_gps =
TinyGPSPlus@>=1.0.2
; NeoGPS^4.2.9
lib_deps_rtc =
RTC@^2.3.0
lib_deps_basic =
@ -222,6 +223,7 @@ build_flags =
upload_protocol = ${common.upload_protocol}
extra_scripts = ${common.extra_scripts}
monitor_speed = ${common.monitor_speed}
upload_port = COM61
[env:ttgobeam]
platform = ${common.platform_espressif32}

View File

@ -20,8 +20,11 @@ static const char TAG[] = "main";
#define DCF77_FRAME_SIZE (60)
#define DCF77_PULSE_DURATION (100)
// select internal / external clock
#if defined RTC_INT && defined RTC_CLK
#define PPS RTC_CLK
#elif defined GPS_INT && defined GPS_CLK
#define PPS GPS_CLK
#else
#define PPS DCF77_PULSE_DURATION
#endif
@ -127,13 +130,16 @@ void dcf77_loop(void *pvParameters) {
&wakeTime, // receives moment of call from isr
portMAX_DELAY); // wait forever (missing error handling here...)
// select clock scale
#if (PPS == DCF77_PULSE_DURATION) // we don't need clock rescaling
DCF_Out(0);
#elif (PPS > DCF77_PULSE_DURATION) // we need upclocking
for (uint8_t i = 1; i <= PPS / DCF77_PULSE_DURATION; i++) {
DCF_Out(0);
vTaskDelayUntil(&wakeTime, pdMS_TO_TICKS(DCF77_PULSE_DURATION));
}
#elif (PPS < DCF77_PULSE_DURATION) // we need downclocking
vTaskDelayUntil(&wakeTime, pdMS_TO_TICKS(DCF77_PULSE_DURATION - PPS));
DCF_Out(0);

View File

@ -18,6 +18,11 @@ int gps_init(void) {
int ret = 1;
if (!gps_config()) {
ESP_LOGE(TAG, "GPS chip initializiation error");
return 0;
}
#if defined GPS_SERIAL
GPS_Serial.begin(GPS_SERIAL);
ESP_LOGI(TAG, "Using serial GPS");
@ -41,6 +46,21 @@ int gps_init(void) {
return ret;
} // gps_init()
// detect gps chipset type and configure it with device specific settings
int gps_config() {
int rslt = 1; // success
#if defined GPS_SERIAL
/* to come */
#elif defined GPS_I2C
/* to come */
#endif
return rslt;
}
// read GPS data and cast to global struct
void gps_read() {
gps_status.latitude = (int32_t)(gps.location.lat() * 1e6);
@ -73,8 +93,8 @@ time_t get_gpstime(void) {
if ((gps.time.age() < 1500) && (gps.time.isValid())) {
t = tmConvert_t(gps.date.year(), gps.date.month(), gps.date.day(),
gps.time.hour(), gps.time.minute(), gps.time.second());
ESP_LOGD(TAG, "GPS time: %4d/%02d/%02d %02d:%02d:%02d", year(t), month(t), day(t),
hour(t), minute(t), second(t));
ESP_LOGD(TAG, "GPS time: %4d/%02d/%02d %02d:%02d:%02d", year(t), month(t),
day(t), hour(t), minute(t), second(t));
} else {
ESP_LOGW(TAG, "GPS has no confident time");
}

View File

@ -19,8 +19,14 @@
#define HAS_BUTTON GPIO_NUM_39 // on board button (next to reset)
#define HAS_BATTERY_PROBE ADC1_GPIO35_CHANNEL // battery probe GPIO pin -> ADC1_CHANNEL_7
#define BATT_FACTOR 2 // voltage divider 100k/100k on board
// GPS settings
#define HAS_GPS 1 // use on board GPS
#define GPS_SERIAL 9600, SERIAL_8N1, GPIO_NUM_12, GPIO_NUM_15 // UBlox NEO 6M or 7M with default configuration
// to use
#define GPS_INT GPIO_NUM_34 // 30ns accurary timepulse, to be external wired on pcb: R34 -> GPIO34
// 1 pulse per second, synchronized at rising edge, pulse length 100ms, accuracy +/- 3 *e-8 [nanoseconds] = 0,95sec / year
#define GPS_CLK (1000)
// enable only if device has these sensors, otherwise comment these lines
// BME680 sensor on I2C bus
@ -35,7 +41,11 @@
//#define DISPLAY_FLIP 1 // use if display is rotated
// Settings for DCF77 interface
#define HAS_DCF77 GPIO_NUM_13
//#define HAS_DCF77 GPIO_NUM_13
// Settings for IF482 interface
#define HAS_IF482 9600, SERIAL_7E1, GPIO_NUM_12, GPIO_NUM_14 // IF482 serial port parameters
// user defined sensors (if connected)
//#define HAS_SENSORS 1 // comment out if device has user defined sensors

View File

@ -20,12 +20,17 @@
#define MY_OLED_SCL (22)
#define MY_OLED_RST U8X8_PIN_NONE
// Pins for on board DS3231 RTC chip
// Settings for on board DS3231 RTC chip
#define HAS_RTC MY_OLED_SDA, MY_OLED_SCL // SDA, SCL
#define RTC_INT GPIO_NUM_34 // interrupt input from rtc
//#define RTC_INT GPIO_NUM_34 // timepulse with accuracy +/- 2*e-6 [microseconds] = 0,1728sec / day
//#define RTC_CLK (1000) // frequency of RTC clock signal in ms
// Settings for IF482 interface
#define HAS_IF482 9600, SERIAL_7E1, GPIO_NUM_12, GPIO_NUM_14 // IF482 serial port parameters
//#define HAS_IF482 9600, SERIAL_7E1, GPIO_NUM_12, GPIO_NUM_14 // IF482 serial port parameters
// Settings for DCF77 interface
#define HAS_DCF77 GPIO_NUM_14
#define DCF77_ACTIVE_LOW 1
// Settings for external GPS chip
#define HAS_GPS 1 // use on board GPS

View File

@ -91,12 +91,16 @@ static const char TAG[] = "main";
#define IF482_FRAME_SIZE (17)
#define IF482_PULSE_DURATION (1000)
#ifdef RTC_CLK
// select internal / external clock
#if defined RTC_INT && defined RTC_CLK
#define PPS RTC_CLK
#elif defined GPS_INT && defined GPS_CLK
#define PPS GPS_CLK
#else
#define PPS IF482_PULSE_DURATION
#endif
HardwareSerial IF482(2); // use UART #2 (note: #1 may be in use for serial GPS)
// initialize and configure IF482 Generator
@ -175,20 +179,22 @@ void if482_loop(void *pvParameters) {
&wakeTime, // receives moment of call from isr
portMAX_DELAY); // wait forever (missing error handling here...)
// select clock scale
#if (PPS == IF482_PULSE_DURATION) // we don't need clock rescaling
// wait until it's time to start transmit telegram for next second
vTaskDelayUntil(&wakeTime, shotTime); // sets waketime to moment of shot
IF482.print(IF482_Out(now() + 1));
#elif (PPS > IF482_PULSE_DURATION) // we need upclocking
for (uint8_t i = 1; i <= PPS / IF482_PULSE_DURATION; i++) {
vTaskDelayUntil(&wakeTime, shotTime); // sets waketime to moment of shot
IF482.print(IF482_Out(now() + 1));
}
#elif (PPS < IF482_PULSE_DURATION) // we need downclocking
IF482.print(IF482_Out(now() + 1));
vTaskDelayUntil(&wakeTime,
shotTime - PPS); // sets waketime to moment of shot
#endif
}
} // if482_loop()

View File

@ -102,8 +102,10 @@ float get_rtctemp(void) {
#endif // HAS_RTC
int pps_init(uint32_t clk_freq_ms) {
// use fixed pulse clock as time base
// helper function to setup a pulse for time synchronisation
int pps_init(uint32_t pulse_period_ms) {
// use pulse from on board RTC chip as time base with fixed frequency
#if defined RTC_INT && defined RTC_CLK
// setup external interupt for active low RTC INT pin
@ -121,13 +123,16 @@ int pps_init(uint32_t clk_freq_ms) {
}
return 1; // success
#elif defined RTC_INT && defined HAS_GPS
#else
// use clock with adjustable frequency
if (clk_freq_ms) {
// use ESP32 hardware timer as time base with adjustable frequency
if (pulse_period_ms) {
ESP_LOGI(TAG, "Time base ESP32 clock");
clockCycle = timerBegin(1, 8000, true); // set 80 MHz prescaler to 1/10000 sec
clockCycle =
timerBegin(1, 8000, true); // set 80 MHz prescaler to 1/10000 sec
timerAttachInterrupt(clockCycle, &CLOCKIRQ, true);
timerAlarmWrite(clockCycle, 10 * clk_freq_ms, true); //ms
timerAlarmWrite(clockCycle, 10 * pulse_period_ms, true); // ms
} else {
ESP_LOGE(TAG, "Invalid pulse clock frequency");
return 0; // failure
@ -138,7 +143,8 @@ int pps_init(uint32_t clk_freq_ms) {
void pps_start() {
#ifdef RTC_INT // start external clock
attachInterrupt(digitalPinToInterrupt(RTC_INT), CLOCKIRQ, FALLING);
//attachInterrupt(digitalPinToInterrupt(RTC_INT), CLOCKIRQ, FALLING);
attachInterrupt(digitalPinToInterrupt(RTC_INT), CLOCKIRQ, RISING);
#else // start internal clock
timerAlarmEnable(clockCycle);
#endif