Update aftb_vpp.h for new VPP measurement

This commit is contained in:
HubertH 2024-02-14 22:58:19 +01:00 committed by GitHub
parent d3ec2befd2
commit 2e88c0324d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -2,6 +2,7 @@
* Variable voltage functions for Afterburner GAL project. * Variable voltage functions for Afterburner GAL project.
* *
* 2024-02-02 Minor changes in varVppInit() * 2024-02-02 Minor changes in varVppInit()
* 2024-02-14 Redesign of VPP measurement (function varVppMeasureVpp())
*/ */
#ifndef __AFTB_VPP_H__ #ifndef __AFTB_VPP_H__
#define __AFTB_VPP_H__ #define __AFTB_VPP_H__
@ -15,6 +16,7 @@
#define VPP A0 #define VPP A0
#include "aftb_mcp4131.h" #include "aftb_mcp4131.h"
#include "aftb_adcparms.h"
#ifndef FAIL #ifndef FAIL
#define FAIL 0 #define FAIL 0
#define OK 1 #define OK 1
@ -41,19 +43,14 @@
#define MAX_WIPER 16 #define MAX_WIPER 16
#define VPP_VERBOSE 0 #define VPP_VERBOSE 1
#ifdef EXTERNAL
#define ANALOG_REF_EXTERNAL EXTERNAL
#else
#define ANALOG_REF_EXTERNAL AR_EXTERNAL
#endif
/* No longer necessary due to new measurement algorithm
//UNO R4 Minima or Wifi (Aref internally pulled down by 130kOhm, AVR Uno R3 pulled down by 32kOhm) //UNO R4 Minima or Wifi (Aref internally pulled down by 130kOhm, AVR Uno R3 pulled down by 32kOhm)
#ifdef _RENESAS_RA_ #ifdef _RENESAS_RA_
#define AREF_IS_3V2 #define AREF_IS_3V2
#endif #endif
*/
//pot wiper indices for the voltages //pot wiper indices for the voltages
uint8_t vppWiper[MAX_WIPER] = {0}; uint8_t vppWiper[MAX_WIPER] = {0};
@ -79,7 +76,7 @@ static void varVppReadCalib(void) {
calOffset = (int8_t) EEPROM.read(2); calOffset = (int8_t) EEPROM.read(2);
for (i = 0; i < MAX_WIPER; i++) { for (i = 0; i < MAX_WIPER; i++) {
vppWiper[i] = EEPROM.read(i + 3); vppWiper[i] = EEPROM.read(i + 3);
#if 0 #if 1
Serial.print(F("Calib ")); Serial.print(F("Calib "));
Serial.print(i); Serial.print(i);
Serial.print(F(":")); Serial.print(F(":"));
@ -149,6 +146,31 @@ static void varVppSet(uint8_t value) {
varVppSetVppIndex(vppWiper[value]); varVppSetVppIndex(vppWiper[value]);
} }
// New VPP measurement algorithm
#define MCOUNT (14) // Number of added measurements as integer
#define ADCRES (10) // Analog Read Resolution in bits as integer
static int16_t varVppMeasureVpp(int8_t printValue) {
int adcsum = 0; // Sum MCOUNT measurements here
int loops = 0; // Counter for measure loop
float vpp; // Vpp result as float
// Precalculate constant parts of the formula
float divisor = ADC_R6 * float(1 << ADCRES);
float dividend = VREF * (ADC_R5 + ADC_R6);
// Measure MCOUNT times and add results
do {
adcsum += analogRead(VPP); // Sum MCOUNT measurements here
} while (++loops < MCOUNT);
// Now calculate the VPP
vpp = (float(adcsum) * dividend) / divisor / float(MCOUNT);
vpp += float(calOffset) / 100.0;
if (printValue) {
Serial.println(vpp);
}
return int16_t(vpp * 100.0);
}
/* No longer necessary due to new measurement algorithm
// UNO R4/Minima - Renesas IC (significant ADC gain errors measured) // UNO R4/Minima - Renesas IC (significant ADC gain errors measured)
#ifdef AREF_IS_3V2 #ifdef AREF_IS_3V2
#define SAMPLE_CNT 16 #define SAMPLE_CNT 16
@ -201,7 +223,7 @@ static int16_t varVppMeasureVpp(int8_t printValue) {
} }
return r1; return r1;
} }
*/
// Returns 1 on Success, 0 on Failure // Returns 1 on Success, 0 on Failure
static uint8_t varVppCalibrateVpp(void) { static uint8_t varVppCalibrateVpp(void) {
uint8_t vppIndex = 0; uint8_t vppIndex = 0;
@ -305,7 +327,7 @@ static void varVppStoreWiperCalib() {
//return 1 on success (variable VPP functionality present), 0 on failure (VPP not detected on board) //return 1 on success (variable VPP functionality present), 0 on failure (VPP not detected on board)
static int8_t varVppInit(void) { static int8_t varVppInit(void) {
analogReference(ANALOG_REF_EXTERNAL); //use 3V3 external reference analogReference(AREF_SOURCE); //use analog reference depending on settings in aftp_adcparms.h
analogRead(VPP); // Perform a dummy conversion referring to the datasheet analogRead(VPP); // Perform a dummy conversion referring to the datasheet
wiperStat = 0; //wiper disabled wiperStat = 0; //wiper disabled