OBC Time Service - PW-Sat2/PWSat2OBC GitHub Wiki
Time Service is component responsible for maintaining mission time.
Time Service's processes:
- TS1: Time update
- TS2: Time correction and storage
- TBD: TS3: Time restore on startup
TS1: Time update
- Updates in-memory mission time.
- Uses internal Backup Real Time Counter (BURTC) to increment mission time.
- Use LFRCO oscilator (
burtcInit.clkSel = burtcClkSelLFRCO;)
- Use LFRCO oscilator (
- Procedure:
- Startup:
- Initialize semaphore
- Initialize BURTC
- Enable Interrupt (
NVIC_EnableIRQ(BURTC_IRQn)) - Start task
- ISR (
void BURTC_IRQHandler(void)):- Give semaphore
- Time monitoring task:
- [In infinite loop]
- Take semaphore
- Success:
- call time service with
TIME_UPDATE_INTERVALms increment - Optionally: substract 1 ms every 50 intervals to reduce measuring error
- Failure: log
- Startup:
- Values:
- Prescaler set to 3 (244 μs) (
burtcInit.clkDiv = 3) - Compare value set to 205 (
BURTC_CompareSet(BURTC_CounterGet() + 205)) TIME_UPDATE_INTERVAL= 50 ms (~ 244 μs * 205)- Accuracy with above settings:
- Interrupt interval every 50.02 ms
- 0.04% error: (20 μs error every interrupt, 1 ms error every 50 interrupts, 360 ms error every 15 minutes)
- Prescaler set to 3 (244 μs) (
TS2: Time correction and storage
- Corrects the mission time by taking into account value from external real time clock (EXRTC)
- Persists the mission time to external flash
- Runs every
TIME_PERSIST_INTERVALminutes - Task procedure:
- Read initial values on startup:
- Read current mission time from time service ->
MCU[t-1] - Read current time from EXRTC ->
RTC[t-1]
- Read current mission time from time service ->
- [Infinite loop]:
- Delay
TIME_PERSIST_INTERVALminutes - Read update values:
MCU[t]from time serviceRTC[t]from EXRTC
- Correct the
MCU[t]ΔMCU = (MCU[t] - MCU[t-1])ΔRTC = (RTC[t] - RTC[t-1])- If either
Δis negative set it to 0 MCU[t] = MCU[t-1] + (ΔMCU + ΔRTC)/2
- Persist the
MCU[t]andRTC[t]on external flash RTC[t-1] = RTC[t], MCU[t-1] = MCU[t]
- Read initial values on startup:
- Values:
TIME_PERSIST_INTERVAL= 15 minutes