From ae4787463945f83e823e65c8034f17f5ee31f3a5 Mon Sep 17 00:00:00 2001 From: pingud98 Date: Tue, 14 Mar 2017 01:19:44 +0100 Subject: [PATCH] added spreadsheet --- .~lock.CosmicPiHVSetpoints.ods# | 1 + CosmicPiArduino.ino | 345 ++++++++++++++++++-------------- CosmicPiHVSetpoints.ods | Bin 0 -> 20355 bytes peripherals.ino | 4 +- 4 files changed, 198 insertions(+), 152 deletions(-) create mode 100644 .~lock.CosmicPiHVSetpoints.ods# create mode 100644 CosmicPiHVSetpoints.ods diff --git a/.~lock.CosmicPiHVSetpoints.ods# b/.~lock.CosmicPiHVSetpoints.ods# new file mode 100644 index 0000000..c737fad --- /dev/null +++ b/.~lock.CosmicPiHVSetpoints.ods# @@ -0,0 +1 @@ +,jimmy,jimmy-Edgar,14.03.2017 01:17,file:///home/jimmy/.config/libreoffice/4; \ No newline at end of file diff --git a/CosmicPiArduino.ino b/CosmicPiArduino.ino index f77d1a7..09bafd1 100644 --- a/CosmicPiArduino.ino +++ b/CosmicPiArduino.ino @@ -7,13 +7,21 @@ float ADCTempValue = 0; //buffer for the internal temperature String SerialNumberValue = ""; //Buffer for the serial number long PPSLength = 0; //The number of internal clock cycles in a GPS PPS -long PPSUptime = 0; //The number of PPS pulses counted since the last reboot. +long PPSUptime = 0; //The number of PPS pulses counted since the last reboot. long PreviousPPS = 0; //The value of the previous PPS (to define which second we're in) int EventsThisSecond = 0; //The number of events since the last PPS -bool dump = false; //if there's an event, dump the data. +bool dump = false; //if there's an event, dump the data. +int Ch1Offset = 240; //Channel 1 trigger offset +int Ch2Offset = 240; //Channel 2 trigger offset +bool tempflipvar = true; //flash the light when GPS is locked +bool tempevtvar = false; //temp event value +int readthresholdCh1 = 0; //read in values for the thresholds; for software triggering +int readthresholdCh2 = 0; +int calcthreshCh1 = 0; //calcualte the thresholds +int calcthreshCh2 = 0; //SoftSPI pin assignments -#define SS_pin 42 +#define SS_pin 42 #define SCK_pin 44 #define MISO_pin 22 #define MOSI_pin 43 @@ -43,16 +51,19 @@ bool dump = false; //if there's an event, dump the data. #define AccelFullScale 2.0 // +-2g 16 bit 2's compliment #define GravityEarth 9.80665 //The earth's gravity -const int HVSetpoints[50] = {0x8F,0x8F,0x8E,0x8D,0x8D,0x8C,0x8B,0x8B,0x8A,0x89, - 0x89,0x88,0x87,0x87,0x86,0x86,0x85,0x84,0x84,0x83, - 0x82,0x82,0x81,0x80,0x80,0x7F,0x7E,0x7E,0x7D,0x7D, - 0x7C,0x7B,0x7B,0x7A,0x79,0x79,0x78,0x77,0x77,0x76, - 0x75,0x75,0x74,0x73,0x73,0x72,0x72,0x71,0x70,0x70}; + +//this table is WAY OFF +const int HVSetpoints[50] = {98,98,97,97,96, 96,95,95,94,94, + 93,93,92,92,91, 91,90,90,89,88, + 88,87,87,86,86, 85,85,84,84,83, + 83,82,82,81,81, 80,80,79,79,78, + 78,77,77,76,76, 75,75,74,74,73 + }; //HV setpoints, starting from 0 to 50 degrees (i.e. 0th element is 0 degrees) - add 0.5 and cast as an int for the index. String StringEventBuf[3] = {"Output String Buffer Event 1", "Output String Buffer Event 2", "Output String Buffer Event 3"}; -long EventTimestamp[3] = {0,0,0}; -float Accel[3]; //Accelerometer array, 0 is X, 1 is Y and 2 is Z. +long EventTimestamp[3] = {0, 0, 0}; +float Accel[3]; //Accelerometer array, 0 is X, 1 is Y and 2 is Z. unsigned long timeX = 0; unsigned long oldtime = 0; @@ -60,162 +71,196 @@ unsigned long oldtime = 0; void setup() { //Start Wire (I2C comms) - Wire.begin(); - Wire1.begin(); - + Wire.begin(); + Wire1.begin(); + //LED output pins - pinMode(Power_LED, OUTPUT); //Power LED - pinMode(Event_LED, OUTPUT); //Event LED - pinMode(Event_Input, INPUT); //Event LED - + pinMode(Power_LED, OUTPUT); //Power LED + pinMode(Event_LED, OUTPUT); //Event LED + pinMode(Event_Input, INPUT); //Event LED + //SoftSPI output pins - digitalWrite(SS, HIGH); // Start with SS high - pinMode(SS_pin, OUTPUT); - pinMode(SCK_pin, OUTPUT); - pinMode(MISO_pin, INPUT); //note this is the avalanche output from the MAX1932, but not yet used - pinMode(MOSI_pin, OUTPUT); - + digitalWrite(SS, HIGH); // Start with SS high + pinMode(SS_pin, OUTPUT); + pinMode(SCK_pin, OUTPUT); + pinMode(MISO_pin, INPUT); //note this is the avalanche output from the MAX1932, but not yet used + pinMode(MOSI_pin, OUTPUT); + //I2CPot output pins - pinMode(I2CPot1_PIN, OUTPUT); - pinMode(I2CPot2_PIN, OUTPUT); - pinMode(I2CPot3_PIN, OUTPUT); - //and write them low - digitalWrite(I2CPot1_PIN, LOW); - digitalWrite(I2CPot2_PIN, LOW); - digitalWrite(I2CPot3_PIN, LOW); + pinMode(I2CPot1_PIN, OUTPUT); + pinMode(I2CPot2_PIN, OUTPUT); + pinMode(I2CPot3_PIN, OUTPUT); + //and write them low + digitalWrite(I2CPot1_PIN, LOW); + digitalWrite(I2CPot2_PIN, LOW); + digitalWrite(I2CPot3_PIN, LOW); + + // Pressure sensor address setup + pinMode(AccelSA1, OUTPUT); //Pressure Sensor + digitalWrite(AccelSA1, LOW); + + + //make sure the LED's are off + digitalWrite(Power_LED, 0); + digitalWrite(Event_LED, 0); + + //Turn on the ON led + PowerOn(); + ThresholdSet(255, 255); + + //debug output + Serial.begin(9600);//we run the serial at 9600 for debugging only. + + PressureSetup(); + Serial.println("Temp:"); + Serial.println(PressureTemp()); + VbiasSet(HVSetpoints[int(PressureTemp() + 0.5)]+5); + delay(1000); + //set the thresholds; rewrite this to not echo in future + //read the threshold setpoints + Serial.println("Initial Threshold values"); + int Ch1 = analogRead(A1); + int Ch2 = analogRead(A2); + Serial.print(Ch1); + Serial.print(" "); + Serial.println(Ch2); + Serial.println("Backed-off Analogue values"); + Ch1 = analogRead(A6); + Ch2 = analogRead(A7); + Serial.print(Ch1); + Serial.print(" "); + Serial.println(Ch2); + + calcthreshCh1 =(Ch1+Ch1Offset) >> 2; + calcthreshCh2 =(Ch2+Ch2Offset) >> 2; + ThresholdSet(calcthreshCh1,calcthreshCh2); + + Serial.println("Calculated threshold values"); - // Pressure sensor address setup - pinMode(AccelSA1, OUTPUT); //Pressure Sensor - digitalWrite(AccelSA1, LOW); - - - - Serial.begin(9600);//we run the serial at 9600 for debugging only. + Serial.print(calcthreshCh1); + Serial.print(" "); + Serial.println(calcthreshCh2); - //make sure the LED's are off - digitalWrite(Power_LED, 0); - digitalWrite(Event_LED, 0); - PressureSetup(); - VbiasSet(HVSetpoints[int(PressureTemp()+0.5)]); - //VbiasSet(100); - ThresholdSet(130,130); - - //ADCSetup(); - //TimerInit(); - PowerOn(); - //AccelSetup(); - SerialNumberValue = SerialNumberReadout(); - Serial.println(SerialNumberValue); - Serial.println("finished init"); - timeX = millis(); -Serial.print("analogue values "); -int Ch1 = analogRead(A6); -int Ch2 = analogRead(A7); -Serial.print(Ch1); -Serial.print(" "); -Serial.println(Ch2); + Serial.println("New Threshold values"); + readthresholdCh1 = analogRead(A1); + readthresholdCh2 = analogRead(A2); + Serial.print(readthresholdCh1); + Serial.print(" "); + Serial.println(readthresholdCh2); + + VbiasSet(HVSetpoints[int(PressureTemp() + 0.5)]); + delay(1000); + + /* + //ADCSetup(); + //AccelSetup(); + SerialNumberValue = SerialNumberReadout(); + Serial.println(SerialNumberValue); + Serial.println("finished init"); + //timeX = millis(); + Serial.println("analogue values "); -//) + " " + int(analogRead(A7))); + //TimerInit(); +*/ } void loop() { - //Serial.println(String(analogRead(A6))+" "+String(analogRead(A7))+" " +int(digitalRead(Event_Input))); - Serial.println(PressureTemp()); +// for (int i = 0; i < 220; i++) +// { +// VbiasSet(i); +// delay(100); +// for (int i = 0; i < 5; i++) +// { + int Ch1 = analogRead(A6); + int Ch2 = analogRead(A7); + if (Ch1 > readthresholdCh1) { + if (Ch2 > readthresholdCh2) { + Serial.print(Ch1); + Serial.print(" "); + Serial.println(Ch2); + } + + } - delay(1000); - /* -if (digitalRead(Event_Input)) { -Serial.print("Event "); -oldtime = timeX; -timeX = millis(); -//prints time since program started -Serial.println(timeX - oldtime); -EventFlashOn(); -delay(50); -EventFlashOff(); -} -// Serial.println("temp"); -// Serial.println(HumReadTemp()); -//delay(1000); - -// Serial.println("Hum"); -// Serial.println(HumReadHum()); -//delay(1000); -//ThresholdSet(200,20); -//Serial.println("Accel"); -//AccelRead(); -// Serial.println(String(Accel[0])+" "+ String(Accel[1])+" "+ String(Accel[2])); -*/ + //} + //} } void TimerInit() { - uint32_t config = 0; + uint32_t config = 0; // Set up the power management controller for TC0 and TC2 - pmc_set_writeprotect(false); // Enable write access to power management chip - pmc_enable_periph_clk(ID_TC0); // Turn on power for timer block 0 channel 0 - pmc_enable_periph_clk(ID_TC6); // Turn on power for timer block 2 channel 0 + pmc_set_writeprotect(false); // Enable write access to power management chip + pmc_enable_periph_clk(ID_TC0); // Turn on power for timer block 0 channel 0 + pmc_enable_periph_clk(ID_TC6); // Turn on power for timer block 2 channel 0 - // Timer block zero channel zero is connected only to the PPS + // Timer block zero channel zero is connected only to the PPS // We set it up to load regester RA on each PPS and reset // So RA will contain the number of clock ticks between two PPS, this // value should be very stable +/- one tick - config = TC_CMR_TCCLKS_TIMER_CLOCK1 | // Select fast clock MCK/2 = 42 MHz - TC_CMR_ETRGEDG_RISING | // External trigger rising edge on TIOA0 - TC_CMR_ABETRG | // Use the TIOA external input line - TC_CMR_LDRA_RISING; // Latch counter value into RA + config = TC_CMR_TCCLKS_TIMER_CLOCK1 | // Select fast clock MCK/2 = 42 MHz + TC_CMR_ETRGEDG_RISING | // External trigger rising edge on TIOA0 + TC_CMR_ABETRG | // Use the TIOA external input line + TC_CMR_LDRA_RISING; // Latch counter value into RA - TC_Configure(TC0, 0, config); // Configure channel 0 of TC0 - TC_Start(TC0, 0); // Start timer running + TC_Configure(TC0, 0, config); // Configure channel 0 of TC0 + TC_Start(TC0, 0); // Start timer running - TC0->TC_CHANNEL[0].TC_IER = TC_IER_LDRAS; // Enable the load AR channel 0 interrupt each PPS - TC0->TC_CHANNEL[0].TC_IDR = ~TC_IER_LDRAS; // and disable the rest of the interrupt sources - NVIC_EnableIRQ(TC0_IRQn); // Enable interrupt handler for channel 0 + TC0->TC_CHANNEL[0].TC_IER = TC_IER_LDRAS; // Enable the load AR channel 0 interrupt each PPS + TC0->TC_CHANNEL[0].TC_IDR = ~TC_IER_LDRAS; // and disable the rest of the interrupt sources + NVIC_EnableIRQ(TC0_IRQn); // Enable interrupt handler for channel 0 // Timer block 2 channel zero is connected to the OR of the PPS and the RAY event - - config = TC_CMR_TCCLKS_TIMER_CLOCK1 | // Select fast clock MCK/2 = 42 MHz - TC_CMR_ETRGEDG_RISING | // External trigger rising edge on TIOA1 - TC_CMR_ABETRG | // Use the TIOA external input line - TC_CMR_LDRA_RISING; // Latch counter value into RA - + + config = TC_CMR_TCCLKS_TIMER_CLOCK1 | // Select fast clock MCK/2 = 42 MHz + TC_CMR_ETRGEDG_RISING | // External trigger rising edge on TIOA1 + TC_CMR_ABETRG | // Use the TIOA external input line + TC_CMR_LDRA_RISING; // Latch counter value into RA + TC_Configure(TC2, 0, config); // Configure channel 0 of TC2 TC_Start(TC2, 0); // Start timer running - + TC2->TC_CHANNEL[0].TC_IER = TC_IER_LDRAS; // Enable the load AR channel 0 interrupt each PPS TC2->TC_CHANNEL[0].TC_IDR = ~TC_IER_LDRAS; // and disable the rest of the interrupt sources NVIC_EnableIRQ(TC6_IRQn); // Enable interrupt handler for channel 0 // Set up the PIO controller to route input pins for TC0 and TC2 - PIO_Configure(PIOC,PIO_INPUT, - PIO_PB25B_TIOA0, // D2 Input for PPS - PIO_DEFAULT); + PIO_Configure(PIOC, PIO_INPUT, + PIO_PB25B_TIOA0, // D2 Input for PPS + PIO_DEFAULT); - PIO_Configure(PIOC,PIO_INPUT, - PIO_PC25B_TIOA6, // D5 Input for Trigger - PIO_DEFAULT); + PIO_Configure(PIOC, PIO_INPUT, + PIO_PC25B_TIOA6, // D5 Input for Trigger + PIO_DEFAULT); } void TC0_Handler() { -//This is called the one second event interrupt in documentation + //This is called the one second event interrupt in documentation //when the PPS event occurs PPSLength = TC0->TC_CHANNEL[0].TC_RA; // Read the RA reg (PPS period) TC_GetStatus(TC0, 0); // Read status and clear load bits + tempflipvar = !tempflipvar; + digitalWrite(Power_LED, tempflipvar); + digitalWrite(Event_LED, 0); PPSUptime++; // PPS count - EventsThisSecond=0; //reset the event counter for this second + EventsThisSecond = 0; //reset the event counter for this second } void TC6_Handler() { Serial.println("Cosmic"); //rega1 = TC2->TC_CHANNEL[0].TC_RA; // Read the RA on channel 1 (PPS period) //stsr1 = + // tempevtvar=!tempevtvar; + digitalWrite(Event_LED, 1); + + EventTimestamp[EventsThisSecond] = TC0->TC_CHANNEL[0].TC_RA; //read the main clock and copy it to the event register EventsThisSecond++; //increment the event counter for this second TC_GetStatus(TC2, 0); // Read status clear load bits, unlocking this interrupt. @@ -229,16 +274,16 @@ void ADCSetup() { } -void PowerOn(){ -digitalWrite(Power_LED, 1); +void PowerOn() { + digitalWrite(Power_LED, 1); } -void EventFlashOn(){ -digitalWrite(Event_LED, 1); +void EventFlashOn() { + digitalWrite(Event_LED, 1); } -void EventFlashOff(){ -digitalWrite(Event_LED, 0); +void EventFlashOff() { + digitalWrite(Event_LED, 0); } @@ -246,60 +291,60 @@ digitalWrite(Event_LED, 0); __attribute__ ((section (".ramfunc"))) String SerialNumberReadout() { unsigned int status; - unsigned int pdwUniqueID[4]; - - /* Send the Start Read unique Identifier command (STUI) - * by writing the Flash Command Register with the STUI command. - */ + unsigned int pdwUniqueID[4]; + + /* Send the Start Read unique Identifier command (STUI) + by writing the Flash Command Register with the STUI command. + */ EFC1->EEFC_FCR = (0x5A << 24) | EFC_FCMD_STUI; do { status = EFC1->EEFC_FSR ; } while ((status & EEFC_FSR_FRDY) == EEFC_FSR_FRDY); - /* The Unique Identifier is located in the first 128 bits of the - * Flash memory mapping. So, at the address 0x400000-0x400003. - */ + /* The Unique Identifier is located in the first 128 bits of the + Flash memory mapping. So, at the address 0x400000-0x400003. + */ pdwUniqueID[0] = *(uint32_t *)IFLASH1_ADDR; pdwUniqueID[1] = *(uint32_t *)(IFLASH1_ADDR + 4); pdwUniqueID[2] = *(uint32_t *)(IFLASH1_ADDR + 8); pdwUniqueID[3] = *(uint32_t *)(IFLASH1_ADDR + 12); /* To stop the Unique Identifier mode, the user needs to send the Stop Read unique Identifier - * command (SPUI) by writing the Flash Command Register with the SPUI command. - */ + command (SPUI) by writing the Flash Command Register with the SPUI command. + */ EFC1->EEFC_FCR = (0x5A << 24) | EFC_FCMD_SPUI ; /* When the Stop read Unique Unique Identifier command (SPUI) has been performed, the - * FRDY bit in the Flash Programming Status Register (EEFC_FSR) rises. - */ + FRDY bit in the Flash Programming Status Register (EEFC_FSR) rises. + */ do { status = EFC1->EEFC_FSR ; } while ((status & EEFC_FSR_FRDY) != EEFC_FSR_FRDY); -int uid_ok = 0; -String uidtxt; -uidtxt = String(pdwUniqueID[0]) + String(pdwUniqueID[1]) + String(pdwUniqueID[2]) + String(pdwUniqueID[3]); -return uidtxt; + int uid_ok = 0; + String uidtxt; + uidtxt = String(pdwUniqueID[0]) + String(pdwUniqueID[1]) + String(pdwUniqueID[2]) + String(pdwUniqueID[3]); + return uidtxt; } -float ADCTemp(){ -//Routine uses the internal temperature sensor in the Arduino DUE -//Note this uses the ADC -float trans = 3.3/4096; -float offset = 0.8; -float factor = 0.00256; -int fixtemp = 27; -uint32_t ulValue = 0; -uint32_t ulChannel; -//BUG: The ADC needs to be reset using these register values; otherwise the values read out are WRONG. +float ADCTemp() { + //Routine uses the internal temperature sensor in the Arduino DUE + //Note this uses the ADC + float trans = 3.3 / 4096; + float offset = 0.8; + float factor = 0.00256; + int fixtemp = 27; + uint32_t ulValue = 0; + uint32_t ulChannel; + //BUG: The ADC needs to be reset using these register values; otherwise the values read out are WRONG. //REG_ADC_MR = 0x00000000; // Void this register //REG_ADC_CHER = 0; // No channels running - + // Enable the corresponding channel adc_enable_channel(ADC, ADC_TEMPERATURE_SENSOR); @@ -318,8 +363,8 @@ uint32_t ulChannel; // Disable the corresponding channel adc_disable_channel(ADC, ADC_TEMPERATURE_SENSOR); -float treal = fixtemp + (( trans * ulValue ) - offset ) / factor; + float treal = fixtemp + (( trans * ulValue ) - offset ) / factor; -return treal; + return treal; } diff --git a/CosmicPiHVSetpoints.ods b/CosmicPiHVSetpoints.ods new file mode 100644 index 0000000000000000000000000000000000000000..14966acb8d4214c08f2ed8921c2021ecf6ec013d GIT binary patch literal 20355 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 literal 0 HcmV?d00001 diff --git a/peripherals.ino b/peripherals.ino index 100ca76..22c95ac 100644 --- a/peripherals.ino +++ b/peripherals.ino @@ -7,7 +7,7 @@ void ThresholdSet(int ThreshA, int ThreshB) { // Serial.println("Test of threshold setting"); // Serial.print(ThreshA); //Serial.println(analogRead(A1)); //internal readback of the DREF value only, not returned to main code. - Wire.beginTransmission(0x28); // transmit to device #94 (0x5F) + Wire.beginTransmission(I2CPot); // transmit to device #94 (0x5F) // device address is specified in datasheet Wire.write(0x11); // sends instruction byte Wire.write(ThreshA); // sends potentiometer value byte @@ -59,7 +59,7 @@ void VbiasSet(int Vbias) { digitalWrite(SS_pin, LOW); // SS low for (int i = 0; i < 8; i++) // There are 8 bits in a byte { - digitalWrite(MOSI_pin, bitRead(_send, i-7)); // Set MOSI + digitalWrite(MOSI_pin, bitRead(_send, 7-i)); // Set MOSI digitalWrite(SCK_pin, HIGH); // SCK high //bitWrite(_receive, i, digitalRead(MISO_pin)); // Capture MISO digitalWrite(SCK_pin, LOW); // SCK low