Pinecilv2 adc v2 (#1916)
* Updated NTC lookup * remove float compute from adc (as we dont use it) * Updated adc settings * Updated ADC Init * Custom max temp lookup * Mask Timer around changing timer rate * Use timer channels in sane order * Update IRQ.cpp * Remove ADC dummy wait on start/stop * Dont use ADC IRQ * Disable sampling delay * Update Setup.cpp * PinecilV2 disable ROM driver utils Always use our source * Force settings upgrade on PinecilV2 Fix forced settings upgrade on Pinecilv2 * Prevent ADC rollover * Update Setup.cpp * ADC cleanup * Rollover prevention * Measure tip temperature 2nd * Rebase Buffalo SDK to 1.4.5 (#1923) * Update bl702_adc.c * Update board.c * . * Update bl702_adc.c * Import updated hal_drv * Remove accidental dupe of stack in linker * First pass update BLE stack * Update ReleaseNotes * Update push.yml * Drop BT Audio which we dont use * . * Reformat * Update conn.c * Update hog.c
This commit is contained in:
@@ -24,40 +24,48 @@ history<uint16_t, ADC_Filter_Smooth> ADC_Vin;
|
||||
history<uint16_t, ADC_Filter_Smooth> ADC_Temp;
|
||||
history<uint16_t, ADC_Filter_Smooth> ADC_Tip;
|
||||
|
||||
// IRQ is called at the end of the 8 set readings, pop these from the FIFO and send to filters
|
||||
void adc_fifo_irq(void) {
|
||||
if (ADC_GetIntStatus(ADC_INT_FIFO_READY) == SET) {
|
||||
// Read out all entries in the fifo
|
||||
while (ADC_Get_FIFO_Count()) {
|
||||
uint32_t reading = ADC_Read_FIFO();
|
||||
// As per manual, 26 bit reading; lowest 16 are the ADC
|
||||
uint16_t sample = reading & 0xFFFF;
|
||||
uint8_t source = (reading >> 21) & 0b11111;
|
||||
switch (source) {
|
||||
void read_adc_fifo(void) {
|
||||
// Read out all entries in the fifo
|
||||
uint8_t pending_readings = ADC_Get_FIFO_Count();
|
||||
|
||||
// There _should_ always be 8 readings here. If there are not, it means that the adc didnt start when we wanted and timing slipped
|
||||
// So if there isn't 8 readings, we throw them out
|
||||
if (pending_readings != 8) {
|
||||
MSG((char *)"Discarding out of sync adc %d\r\n", pending_readings);
|
||||
} else {
|
||||
while (pending_readings) {
|
||||
pending_readings--;
|
||||
uint32_t raw_reading = ADC_Read_FIFO();
|
||||
ADC_Result_Type parsed = {0, 0, 0};
|
||||
ADC_Parse_Result(&raw_reading, 1, &parsed);
|
||||
// Rollover prevention
|
||||
if (parsed.value > ((1 << 14) - 1)) {
|
||||
parsed.value = ((1 << 14) - 1);
|
||||
}
|
||||
|
||||
switch (parsed.posChan) {
|
||||
case TMP36_ADC_CHANNEL:
|
||||
ADC_Temp.update(sample);
|
||||
break;
|
||||
case TIP_TEMP_ADC_CHANNEL:
|
||||
ADC_Tip.update(sample);
|
||||
ADC_Temp.update(parsed.value << 2);
|
||||
break;
|
||||
case TIP_TEMP_ADC_CHANNEL: {
|
||||
ADC_Tip.update(parsed.value << 2);
|
||||
} break;
|
||||
case VIN_ADC_CHANNEL:
|
||||
ADC_Vin.update(sample);
|
||||
ADC_Vin.update(parsed.value << 2);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
// unblock the PID controller thread
|
||||
if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) {
|
||||
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
|
||||
if (pidTaskNotification) {
|
||||
vTaskNotifyGiveFromISR(pidTaskNotification, &xHigherPriorityTaskWoken);
|
||||
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
|
||||
}
|
||||
}
|
||||
// unblock the PID controller thread
|
||||
if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) {
|
||||
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
|
||||
if (pidTaskNotification) {
|
||||
vTaskNotifyGiveFromISR(pidTaskNotification, &xHigherPriorityTaskWoken);
|
||||
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
|
||||
}
|
||||
}
|
||||
// Clear IRQ
|
||||
ADC_IntClr(ADC_INT_ALL);
|
||||
}
|
||||
|
||||
volatile bool inFastPWMMode = false;
|
||||
@@ -69,7 +77,24 @@ volatile uint16_t PWMSafetyTimer = 0;
|
||||
volatile uint8_t pendingPWM = 0;
|
||||
volatile bool pendingNextPeriodIsFast = false;
|
||||
|
||||
void start_PWM_output(void) {
|
||||
void timer0_comp0_callback(void) {
|
||||
// Trigged at end of output cycle; turn off the tip PWM
|
||||
PWM_Channel_Disable(PWM_Channel);
|
||||
TIMER_ClearIntStatus(TIMER_CH0, TIMER_COMP_ID_0);
|
||||
}
|
||||
|
||||
// Timer 0 is used to co-ordinate the ADC and the output PWM
|
||||
void timer0_comp1_callback(void) {
|
||||
ADC_FIFO_Clear();
|
||||
ADC_Start();
|
||||
TIMER_ClearIntStatus(TIMER_CH0, TIMER_COMP_ID_1);
|
||||
}
|
||||
void timer0_comp2_callback(void) {
|
||||
// Triggered at end of timer cycle; re-start the tip driver
|
||||
ADC_Stop();
|
||||
TIMER_Disable(TIMER_CH0);
|
||||
// Read the ADC data _now_. So that if things have gone out of sync, we know about it
|
||||
read_adc_fifo();
|
||||
|
||||
if (PWMSafetyTimer) {
|
||||
PWMSafetyTimer--;
|
||||
@@ -82,64 +107,28 @@ void start_PWM_output(void) {
|
||||
}
|
||||
// Update trigger for the end point of the PWM cycle
|
||||
if (pendingPWM > 0) {
|
||||
TIMER_SetCompValue(TIMER_CH0, TIMER_COMP_ID_1, pendingPWM - 1);
|
||||
TIMER_SetCompValue(TIMER_CH0, TIMER_COMP_ID_0, pendingPWM - 1);
|
||||
// Turn on output
|
||||
PWM_Channel_Enable(PWM_Channel);
|
||||
} else {
|
||||
// Leave output off
|
||||
PWM_Channel_Disable(PWM_Channel);
|
||||
}
|
||||
} else {
|
||||
PWM_Channel_Disable(PWM_Channel);
|
||||
switchToFastPWM();
|
||||
}
|
||||
}
|
||||
|
||||
// Timer 0 is used to co-ordinate the ADC and the output PWM
|
||||
void timer0_comp0_callback(void) {
|
||||
if (PWM_Channel_Is_Enabled(PWM_Channel)) {
|
||||
// So there appears to be a bug _somewhere_ where sometimes the comparator doesn't fire
|
||||
// Its not re-occurring with specific values, so suspect its a weird bug
|
||||
// For now, we just skip the cycle and throw away the ADC readings. Its a waste but
|
||||
// It stops stupid glitches in readings, i'd take slight instability from the time jump
|
||||
// Over the readings we get that are borked as the header is left on
|
||||
// <Ralim 2023/10/14>
|
||||
PWM_Channel_Disable(PWM_Channel);
|
||||
// MSG("ALERT PWM Glitch\r\n");
|
||||
// Triger the PID now instead
|
||||
if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) {
|
||||
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
|
||||
if (pidTaskNotification) {
|
||||
vTaskNotifyGiveFromISR(pidTaskNotification, &xHigherPriorityTaskWoken);
|
||||
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
ADC_Start();
|
||||
}
|
||||
TIMER_ClearIntStatus(TIMER_CH0, TIMER_COMP_ID_0);
|
||||
}
|
||||
void timer0_comp1_callback(void) {
|
||||
// Trigged at end of output cycle; turn off the tip PWM
|
||||
PWM_Channel_Disable(PWM_Channel);
|
||||
TIMER_ClearIntStatus(TIMER_CH0, TIMER_COMP_ID_1);
|
||||
}
|
||||
|
||||
void timer0_comp2_callback(void) {
|
||||
// Triggered at end of timer cycle; re-start the tip driver
|
||||
start_PWM_output();
|
||||
TIMER_Enable(TIMER_CH0);
|
||||
TIMER_ClearIntStatus(TIMER_CH0, TIMER_COMP_ID_2);
|
||||
}
|
||||
|
||||
void switchToFastPWM(void) {
|
||||
inFastPWMMode = true;
|
||||
holdoffTicks = 10;
|
||||
holdoffTicks = 20;
|
||||
tempMeasureTicks = 10;
|
||||
totalPWM = powerPWM + tempMeasureTicks + holdoffTicks;
|
||||
|
||||
TIMER_SetCompValue(TIMER_CH0, TIMER_COMP_ID_1, powerPWM + holdoffTicks);
|
||||
|
||||
TIMER_SetCompValue(TIMER_CH0, TIMER_COMP_ID_2, totalPWM);
|
||||
|
||||
// ~10Hz
|
||||
TIMER_SetCompValue(TIMER_CH0, TIMER_COMP_ID_0, powerPWM + holdoffTicks);
|
||||
|
||||
// Set divider to 10 ~= 10.5Hz
|
||||
uint32_t tmpVal = BL_RD_REG(TIMER_BASE, TIMER_TCDR);
|
||||
|
||||
@@ -151,14 +140,14 @@ void switchToFastPWM(void) {
|
||||
void switchToSlowPWM(void) {
|
||||
// 5Hz
|
||||
inFastPWMMode = false;
|
||||
holdoffTicks = 5;
|
||||
holdoffTicks = 10;
|
||||
tempMeasureTicks = 5;
|
||||
totalPWM = powerPWM + tempMeasureTicks + holdoffTicks;
|
||||
|
||||
TIMER_SetCompValue(TIMER_CH0, TIMER_COMP_ID_2, totalPWM);
|
||||
// Adjust ADC
|
||||
TIMER_SetCompValue(TIMER_CH0, TIMER_COMP_ID_0, powerPWM + holdoffTicks);
|
||||
TIMER_SetCompValue(TIMER_CH0, TIMER_COMP_ID_1, powerPWM + holdoffTicks);
|
||||
|
||||
TIMER_SetCompValue(TIMER_CH0, TIMER_COMP_ID_2, totalPWM);
|
||||
// Set divider for ~ 5Hz
|
||||
|
||||
uint32_t tmpVal = BL_RD_REG(TIMER_BASE, TIMER_TCDR);
|
||||
@@ -167,9 +156,11 @@ void switchToSlowPWM(void) {
|
||||
|
||||
BL_WR_REG(TIMER_BASE, TIMER_TCDR, tmpVal);
|
||||
}
|
||||
|
||||
void setTipPWM(const uint8_t pulse, const bool shouldUseFastModePWM) {
|
||||
PWMSafetyTimer = 10; // This is decremented in the handler for PWM so that the tip pwm is
|
||||
// disabled if the PID task is not scheduled often enough.
|
||||
PWMSafetyTimer = 10;
|
||||
// This is decremented in the handler for PWM so that the tip pwm is
|
||||
// disabled if the PID task is not scheduled often enough.
|
||||
pendingPWM = pulse;
|
||||
pendingNextPeriodIsFast = shouldUseFastModePWM;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user