refactored auto-zero code and added absolute field sense mode

This commit is contained in:
Weston 2021-06-05 22:43:10 -07:00
parent 709c94c774
commit b53927a2dd
4 changed files with 815 additions and 402 deletions

View File

@ -19670,8 +19670,6 @@ void set_led(uint8_t);
void init_sensor(void);
void reset_sensor(void);
void my_CMP2_ISR(void){
PIR2bits.C2IF = 0;
@ -19765,60 +19763,125 @@ void zero_stage_1(void){
uint16_t gnd_ref_val;
uint16_t best_dac_val = 0;
uint16_t stage_val;
uint16_t best_val = (1<<12);
int16_t best_val = (1<<12);
int16_t diff_value;
uint16_t start_dac;
uint16_t end_dac;
uint16_t old_bw = LATAbits.LATA7;
gnd_ref_val = average_adc_reading(GNDREF_SENSE);
for(uint16_t i = 0; i<1024; i++){
LATAbits.LATA7 = 0;
DAC1_Load10bitInputData(512);
_delay((unsigned long)((10)*(8000000/4000.0)));
stage_val = average_adc_reading(STAGE1_MON);
diff_value = (int16_t) stage_val - (int16_t) gnd_ref_val;
if(diff_value > 100){
start_dac = 0;
end_dac = 512;
}
else if (diff_value < -100 ){
start_dac = 512;
end_dac = 1024;
}
else{
start_dac = 255;
end_dac = 768;
}
DAC1_Load10bitInputData(start_dac);
_delay((unsigned long)((10)*(8000000/4000.0)));
for(uint16_t i = start_dac; i<end_dac; i++){
DAC1_Load10bitInputData(i);
_delay((unsigned long)((1)*(8000000/4000.0)));
stage_val = average_adc_reading(STAGE1_MON);
_delay((unsigned long)((3)*(8000000/4000.0)));
if ((stage_val-gnd_ref_val) < best_val){
best_val = (stage_val - gnd_ref_val);
stage_val = average_adc_reading(STAGE1_MON);
diff_value = (int16_t) stage_val - (int16_t) gnd_ref_val;
if (abs(diff_value)< abs(best_val)){
best_val = diff_value;
best_dac_val = i;
}
}
DAC1_Load10bitInputData(best_dac_val);
LATAbits.LATA7 = old_bw;
}
void zero_stage_2(void){
uint16_t gnd_ref_val;
uint16_t best_dac_val = 0;
uint16_t stage_val;
uint16_t best_val = 2000;
uint16_t old_gain = LATBbits.LATB4;
uint16_t old_bw = LATAbits.LATA7;
int16_t best_val = (1<<12);
int16_t diff_value;
uint16_t start_dac;
uint16_t end_dac;
LATBbits.LATB4 = 0;
LATAbits.LATA7 = 0;
_delay((unsigned long)((20)*(8000000/4000.0)));
gnd_ref_val = average_adc_reading(GNDREF_SENSE);
for(uint16_t i = 0; i<1024; i++){
DAC5_Load10bitInputData(i);
_delay((unsigned long)((1)*(8000000/4000.0)));
DAC5_Load10bitInputData(512);
_delay((unsigned long)((5)*(8000000/4000.0)));
stage_val = average_adc_reading(STAGE2_MON);
diff_value = (int16_t) stage_val - (int16_t) gnd_ref_val;
if ((stage_val-gnd_ref_val) < best_val){
best_val = (stage_val - gnd_ref_val);
best_dac_val = i;
if(diff_value < -100){
start_dac = 0;
end_dac = 512;
}
else if (diff_value > 100 ){
start_dac = 512;
end_dac = 1024;
}
else{
start_dac = 255;
end_dac = 768;
}
DAC5_Load10bitInputData(start_dac);
_delay((unsigned long)((10)*(8000000/4000.0)));
for(uint16_t i = start_dac; i<end_dac; i = i+2){
DAC5_Load10bitInputData(i);
_delay((unsigned long)((2)*(8000000/4000.0)));
stage_val = average_adc_reading(STAGE2_MON);
diff_value = (int16_t) stage_val - (int16_t) gnd_ref_val;
if (abs(diff_value)< abs(best_val)){
best_val = diff_value;
best_dac_val = i;
}
}
DAC5_Load10bitInputData(best_dac_val);
LATBbits.LATB4 = old_gain;
LATAbits.LATA7 = old_bw;
}
void init_sensor(void){
_delay((unsigned long)((50)*(8000000/4000.0)));
_delay((unsigned long)((10)*(8000000/4000.0)));
zero_stage_1();
_delay((unsigned long)((50)*(8000000/4000.0)));
_delay((unsigned long)((10)*(8000000/4000.0)));
zero_stage_2();
}
@ -19852,26 +19915,46 @@ void main(void)
DAC3_SetOutput(24);
DAC4_SetOutput(8);
DAC5_Load10bitInputData(512);
DAC1_Load10bitInputData(512);
_delay((unsigned long)((50)*(8000000/4000.0)));
if((PORTCbits.RC7 == 0) && (PORTBbits.RB0 == 0)){
set_led((0x1 | 0x4));
while(1){
do { LATAbits.LATA6 = 0; } while(0);
_delay((unsigned long)((9)*(8000000/4000.0)));
do { LATAbits.LATA6 = 1; } while(0);
_delay((unsigned long)((9)*(8000000/4000.0)));
}
}
led_color_state = 0x2;
mux_state = 0;
SW2_ISR();
_delay((unsigned long)((100)*(8000000/4000.0)));
_delay((unsigned long)((800)*(8000000/4000.0)));
reset_sensor();
init_sensor();
PIR2bits.C2IF = 0;
PIR2bits.C1IF = 0;
IOCBF0_SetInterruptHandler(SW2_ISR);
IOCCF7_SetInterruptHandler(SW1_ISR);
set_led(0x0);
_delay((unsigned long)((200)*(8000000/4000.0)));
set_led(led_color_state);
(INTCONbits.GIE = 1);
(INTCONbits.PEIE = 1);
while (1)
{
_delay((unsigned long)((100)*(8000000/4000.0)));
_delay((unsigned long)((500)*(8000000/4000.0)));
if((average_adc_reading(channel_FVRBuffer1)>>3) > 460){
(INTCONbits.GIE = 0);
(INTCONbits.PEIE = 0);

File diff suppressed because it is too large Load Diff

View File

@ -73,8 +73,6 @@ void set_led(uint8_t);
void init_sensor(void);
void reset_sensor(void);
void my_CMP2_ISR(void){
// clear the CMP2 interrupt flag
PIR2bits.C2IF = 0;
@ -168,60 +166,125 @@ void zero_stage_1(void){
uint16_t gnd_ref_val;
uint16_t best_dac_val = 0;
uint16_t stage_val;
uint16_t best_val = (1<<12);
int16_t best_val = (1<<12);
int16_t diff_value;
uint16_t start_dac;
uint16_t end_dac;
uint16_t old_bw = MUX_SEL1_LAT;
gnd_ref_val = average_adc_reading(GNDREF_SENSE);
for(uint16_t i = 0; i<1024; i++){
//switch bw to low
MUX_SEL1_LAT = 0;
//initial ranging
DAC1_Load10bitInputData(512);
__delay_ms(10);
stage_val = average_adc_reading(STAGE1_MON);
diff_value = (int16_t) stage_val - (int16_t) gnd_ref_val;
if(diff_value > 100){
start_dac = 0;
end_dac = 512;
}
else if (diff_value < -100 ){
start_dac = 512;
end_dac = 1024;
}
else{
start_dac = 255;
end_dac = 768;
}
DAC1_Load10bitInputData(start_dac);
__delay_ms(10);
for(uint16_t i = start_dac; i<end_dac; i++){
DAC1_Load10bitInputData(i);
__delay_ms(1);
__delay_ms(3);
//__delay_us(100);
stage_val = average_adc_reading(STAGE1_MON);
if ((stage_val-gnd_ref_val) < best_val){
best_val = (stage_val - gnd_ref_val);
diff_value = (int16_t) stage_val - (int16_t) gnd_ref_val;
if (abs(diff_value)< abs(best_val)){
best_val = diff_value;
best_dac_val = i;
}
}
DAC1_Load10bitInputData(best_dac_val);
MUX_SEL1_LAT = old_bw;
}
void zero_stage_2(void){
uint16_t gnd_ref_val;
uint16_t best_dac_val = 0;
uint16_t stage_val;
uint16_t best_val = 2000;
uint16_t old_gain = MUX_SEL2_LAT;
uint16_t old_bw = MUX_SEL1_LAT;
int16_t best_val = (1<<12);
int16_t diff_value;
uint16_t start_dac;
uint16_t end_dac;
//switch gain to high gain
MUX_SEL2_LAT = 0;
//switch bw to low
MUX_SEL1_LAT = 0;
__delay_ms(20);
gnd_ref_val = average_adc_reading(GNDREF_SENSE);
for(uint16_t i = 0; i<1024; i++){
DAC5_Load10bitInputData(i);
__delay_ms(1);
//initial ranging
DAC5_Load10bitInputData(512);
__delay_ms(5);
stage_val = average_adc_reading(STAGE2_MON);
diff_value = (int16_t) stage_val - (int16_t) gnd_ref_val;
if ((stage_val-gnd_ref_val) < best_val){
best_val = (stage_val - gnd_ref_val);
best_dac_val = i;
if(diff_value < -100){
start_dac = 0;
end_dac = 512;
}
else if (diff_value > 100 ){
start_dac = 512;
end_dac = 1024;
}
else{
start_dac = 255;
end_dac = 768;
}
DAC5_Load10bitInputData(start_dac);
__delay_ms(10);
for(uint16_t i = start_dac; i<end_dac; i = i+2){
DAC5_Load10bitInputData(i);
__delay_ms(2);
//__delay_us(100);
stage_val = average_adc_reading(STAGE2_MON);
diff_value = (int16_t) stage_val - (int16_t) gnd_ref_val;
if (abs(diff_value)< abs(best_val)){
best_val = diff_value;
best_dac_val = i;
}
}
DAC5_Load10bitInputData(best_dac_val);
MUX_SEL2_LAT = old_gain;
MUX_SEL1_LAT = old_bw;
}
void init_sensor(void){
__delay_ms(50);
__delay_ms(10);
zero_stage_1();
__delay_ms(50);
__delay_ms(10);
zero_stage_2();
}
@ -255,12 +318,30 @@ void main(void)
DAC3_SetOutput(24); //set overload high comparator
DAC4_SetOutput(8); //set overload low comparator
//init offset dac
DAC5_Load10bitInputData(512);
DAC1_Load10bitInputData(512);
__delay_ms(50);
//absolute field sensing / debug mode
if((SW1_GetValue() == 0) && (SW2_GetValue() == 0)){
set_led(LED_PURPLE);
while(1){
SR_SetLow();
__delay_ms(9);
SR_SetHigh();
__delay_ms(9);
}
}
led_color_state = LED_GREEN;
mux_state = 0;
SW2_ISR();//initialize LED and mux
__delay_ms(100); //system warmup
__delay_ms(800); //system warmup
reset_sensor();
init_sensor();
//init_sensor();
//zeroing system may trip over range comparators
PIR2bits.C2IF = 0;
PIR2bits.C1IF = 0;
@ -268,13 +349,15 @@ void main(void)
IOCBF0_SetInterruptHandler(SW2_ISR);
//set interrupt handler for SW1
IOCCF7_SetInterruptHandler(SW1_ISR);
set_led(LED_OFF);
__delay_ms(200);
set_led(led_color_state);
INTERRUPT_GlobalInterruptEnable();
INTERRUPT_PeripheralInterruptEnable();
while (1)
{
__delay_ms(100);
__delay_ms(500);
if((average_adc_reading(channel_FVRBuffer1)>>3) > HIGH_FVR_VOLTAGE){
INTERRUPT_GlobalInterruptDisable();
INTERRUPT_PeripheralInterruptDisable();

View File

@ -2,6 +2,12 @@
<project-private xmlns="http://www.netbeans.org/ns/project-private/1">
<editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/2" lastBookmarkId="0"/>
<open-files xmlns="http://www.netbeans.org/ns/projectui-open-files/2">
<group/>
<group>
<file>file:/home/wbraun/projects/little-bee-B1/firmware/B1-firmware.X/mcc_generated_files/adc.h</file>
<file>file:/home/wbraun/projects/little-bee-B1/firmware/B1-firmware.X/mcc_generated_files/pin_manager.c</file>
<file>file:/home/wbraun/projects/little-bee-B1/firmware/B1-firmware.X/main.c</file>
<file>file:/home/wbraun/projects/little-bee-B1/firmware/B1-firmware.X/mcc_generated_files/mcc.h</file>
<file>file:/home/wbraun/projects/little-bee-B1/firmware/B1-firmware.X/mcc_generated_files/pin_manager.h</file>
</group>
</open-files>
</project-private>