Changeset 73 for trunk/fw_g473rct/SES/src/ads1260.c
- Timestamp:
- Aug 4, 2026, 1:53:58 PM (25 hours ago)
- File:
-
- 1 edited
-
trunk/fw_g473rct/SES/src/ads1260.c (modified) (18 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/fw_g473rct/SES/src/ads1260.c
r38 r73 51 51 #include "iwdg.h" 52 52 // --- EXTERNE VARIABLEN -------------------------------------------------------- 53 53 extern CRC_HandleTypeDef hcrc; 54 54 // --- LOKALE DEFINES - bitte hier dokumentieren -------------------------------- 55 55 … … 116 116 #define CHOP_MODE_RESET_MASK ~(0b11 << 5)/*Default*/ 117 117 118 #define CONVERSION_MODE_REGISTER (CHOP_MODE_REGISTER)118 #define CONVERSION_MODE_REGISTER (CHOP_MODE_REGISTER) 119 119 #define CONVERSION_MODE_CONTINIOUS (0 << 4)/*Default*/ 120 120 #define CONVERSION_MODE_PULSE (1 << 4) 121 121 #define CONVERSION_MODE_RESET_MASK ~(1 << 4) 122 122 123 #define CONVERSION_START_DELAY_REGISTER (CHOP_MODE_REGISTER)123 #define CONVERSION_START_DELAY_REGISTER (CHOP_MODE_REGISTER) 124 124 #define CONVERSION_START_DELAY_0u (0b0000 << 0) 125 125 #define CONVERSION_START_DELAY_50u (0b0001 << 0)/*Default*/ … … 173 173 #define POS_INPUT_MUX_SELECT_AIN3 (0b0100 << 4) 174 174 #define POS_INPUT_MUX_SELECT_AIN4 (0b0101 << 4) 175 #define POS_INPUT_MUX_SELECT_AIN5 (0b0110 << 4) 176 #define POS_INPUT_MUX_SELECT_AIN6 (0b0111 << 4) 177 #define POS_INPUT_MUX_SELECT_AIN7 (0b1000 << 4) 178 #define POS_INPUT_MUX_SELECT_AIN8 (0b1001 << 4) 179 #define POS_INPUT_MUX_SELECT_AIN9 (0b1010 << 4) 175 180 #define POS_INPUT_MUX_SELECT_INT_TEMP_SENSOR_POS (0b1011 << 4) 176 181 #define POS_INPUT_MUX_SELECT_INT_AVDD_DIV4_POS (0b1100 << 4) … … 185 190 #define NEG_INPUT_MUX_SELECT_AIN3 (0b0100 << 0) 186 191 #define NEG_INPUT_MUX_SELECT_AIN4 (0b0101 << 0) 192 #define NEG_INPUT_MUX_SELECT_AIN5 (0b0110 << 0) 193 #define NEG_INPUT_MUX_SELECT_AIN6 (0b0111 << 0) 194 #define NEG_INPUT_MUX_SELECT_AIN7 (0b1000 << 0) 195 #define NEG_INPUT_MUX_SELECT_AIN8 (0b1001 << 0) 196 #define NEG_INPUT_MUX_SELECT_AIN9 (0b1010 << 0) 187 197 #define NEG_INPUT_MUX_SELECT_INT_TEMP_SENSOR_NEG (0b1011 << 0) 188 198 #define NEG_INPUT_MUX_SELECT_INT_AVDD_DIV4_NEG (0b1100 << 0) … … 201 211 int32_t avgValWithOffsetCommonModeOffsetTemperatureCorrection; 202 212 double current; 213 double batteryvoltage; 214 double shuntVoltage; 203 215 double currentWithGainCorrection; 204 216 double currentWithGainAndGainShuntTempCorrection; … … 230 242 static void ADS_1260_SetInternalReference(SPI_HandleTypeDef * hspi); 231 243 static void ADS_1260_SetExternalReference(SPI_HandleTypeDef * hspi); 232 static void ADS_1260_InputMuxSelect(SPI_HandleTypeDef * hspi, uint8_t muxSelect );244 static void ADS_1260_InputMuxSelect(SPI_HandleTypeDef * hspi, uint8_t muxSelect, uint8_t crcmode); 233 245 static void ADS_1260_SetChopMode(SPI_HandleTypeDef * hspi, uint8_t chopMode); 234 246 static void ADS_1260_ActivateStatusData(void); … … 237 249 static uint32_t ADS1260_ProcessCurrent(int32_t current); 238 250 volatile uint32_t newCurrentValue=0; 251 volatile uint32_t channelInProgress; // 0 = current, 1 = voltage battery 239 252 //static uint32_t ADS1260_ProcessVoltage(int32_t voltage, sys_data_t * data); 240 253 //static uint32_t ADS1260_ProcessTemperature(int32_t temperature, sys_data_t * data); … … 383 396 * @retval kein 384 397 */ 385 static void ADS_1260_InputMuxSelect(SPI_HandleTypeDef * hspi, uint8_t muxSelect) 386 { 387 // Write 388 uint8_t spiData[3] = {(REGISTER_WRITE_COMMAND + INPUT_MUX_REGISTER), muxSelect, 0}; 389 //HAL_GPIO_WritePin(ADC_SPI1_NSS_GPIO_Port, ADC_SPI1_NSS_Pin, GPIO_PIN_RESET); 390 HAL_SPI_TransmitReceive(hspi, spiData, spiData, 2, DEFAULT_ADS1260_TRANSMIT_RECEIVE_TIMEOUT); 391 //HAL_GPIO_WritePin(ADC_SPI1_NSS_GPIO_Port, ADC_SPI1_NSS_Pin, GPIO_PIN_SET); 392 // Read 393 spiData[COMMAND_POS] = (REGISTER_READ_COMMAND + INPUT_MUX_REGISTER); 394 //HAL_GPIO_WritePin(ADC_SPI1_NSS_GPIO_Port, ADC_SPI1_NSS_Pin, GPIO_PIN_RESET); 395 HAL_SPI_TransmitReceive(hspi, spiData, spiData, 3, DEFAULT_ADS1260_TRANSMIT_RECEIVE_TIMEOUT); 396 //HAL_GPIO_WritePin(ADC_SPI1_NSS_GPIO_Port, ADC_SPI1_NSS_Pin, GPIO_PIN_SET); 397 // Verifie 398 if(spiData[RECEIVE_DATA_POS] != muxSelect) 399 { 400 printf("ERROR ADS_1260_InputMuxSelect\n"); 401 // while(1); 402 } 398 static void ADS_1260_InputMuxSelect(SPI_HandleTypeDef * hspi, uint8_t muxSelect,uint8_t crcmode) 399 { 400 if (crcmode==0) 401 { 402 // Write 403 uint8_t spiData[3] = {(REGISTER_WRITE_COMMAND + INPUT_MUX_REGISTER), muxSelect, 0}; 404 //HAL_GPIO_WritePin(ADC_SPI1_NSS_GPIO_Port, ADC_SPI1_NSS_Pin, GPIO_PIN_RESET); 405 HAL_SPI_TransmitReceive(hspi, spiData, spiData, 2, DEFAULT_ADS1260_TRANSMIT_RECEIVE_TIMEOUT); 406 //HAL_GPIO_WritePin(ADC_SPI1_NSS_GPIO_Port, ADC_SPI1_NSS_Pin, GPIO_PIN_SET); 407 // Read 408 spiData[COMMAND_POS] = (REGISTER_READ_COMMAND + INPUT_MUX_REGISTER); 409 //HAL_GPIO_WritePin(ADC_SPI1_NSS_GPIO_Port, ADC_SPI1_NSS_Pin, GPIO_PIN_RESET); 410 HAL_SPI_TransmitReceive(hspi, spiData, spiData, 3, DEFAULT_ADS1260_TRANSMIT_RECEIVE_TIMEOUT); 411 //HAL_GPIO_WritePin(ADC_SPI1_NSS_GPIO_Port, ADC_SPI1_NSS_Pin, GPIO_PIN_SET); 412 // Verifie 413 if(spiData[RECEIVE_DATA_POS] != muxSelect) 414 { 415 printf("ERROR ADS_1260_InputMuxSelect\n"); 416 } 417 } 418 else 419 420 { 421 422 // Write 423 uint8_t spiDataIn[6]; 424 spiDataIn[0] = REGISTER_WRITE_COMMAND + INPUT_MUX_REGISTER; 425 spiDataIn[1] = muxSelect; 426 spiDataIn[2] = HAL_CRC_Calculate(&hcrc, (uint32_t*) spiDataIn, 2); 427 spiDataIn[3] = 0; 428 429 uint8_t spiDataOut[6] = {0,0,0,0,0,0}; 430 //HAL_GPIO_WritePin(ADC_SPI1_NSS_GPIO_Port, ADC_SPI1_NSS_Pin, GPIO_PIN_RESET); 431 HAL_SPI_TransmitReceive(hspi, spiDataIn, spiDataOut, 4, DEFAULT_ADS1260_TRANSMIT_RECEIVE_TIMEOUT); 432 //HAL_GPIO_WritePin(ADC_SPI1_NSS_GPIO_Port, ADC_SPI1_NSS_Pin, GPIO_PIN_SET); 433 434 // Read back mux register 435 spiDataIn[0] = (REGISTER_READ_COMMAND + INPUT_MUX_REGISTER); 436 spiDataIn[1] = arbitraryByte; 437 spiDataIn[2] = HAL_CRC_Calculate(&hcrc, (uint32_t*) spiDataIn, 2); 438 spiDataIn[3] = 0; 439 spiDataIn[4] = 0; 440 spiDataIn[5] = 0; 441 442 443 444 //HAL_GPIO_WritePin(ADC_SPI1_NSS_GPIO_Port, ADC_SPI1_NSS_Pin, GPIO_PIN_RESET); 445 HAL_SPI_TransmitReceive(hspi, spiDataIn, spiDataOut, 6, DEFAULT_ADS1260_TRANSMIT_RECEIVE_TIMEOUT); 446 //HAL_GPIO_WritePin(ADC_SPI1_NSS_GPIO_Port, ADC_SPI1_NSS_Pin, GPIO_PIN_SET); 447 // Verifie 448 if(spiDataOut[4] != muxSelect) 449 { 450 printf("ERROR ADS_1260_InputMuxSelect\n"); 451 } 452 } 453 403 454 } 404 455 … … 613 664 static uint32_t ADS1260_ProcessCurrent(int32_t newval) 614 665 { 615 static signed long avgsum = 0;616 static int meas_counter;617 if (meas_counter < INT32_MAX) meas_counter++;618 int32_t avgval;666 //static signed long avgsum = 0; 667 //static int meas_counter; 668 //if (meas_counter < INT32_MAX) meas_counter++; 669 //int32_t avgval; 619 670 620 671 // Filterlängen in 2er-Potenzen --> Compiler optimiert 621 avgsum -= avgsum/ BATTERY_CURRENT_FILTER;622 avgsum += newval;623 avgval = avgsum / BATTERY_CURRENT_FILTER;624 sys_data.s.values.battryCurrentRaw = avgval;672 //avgsum -= avgsum/ BATTERY_CURRENT_FILTER; 673 //avgsum += newval; 674 //avgval = avgsum / BATTERY_CURRENT_FILTER; 675 sys_data.s.values.battryCurrentRaw = newval; 625 676 /**********************Offset Kompensation:*******************************/ 626 677 // Offset abziehen 627 avgValWithOffsetCompensation = avgval - sys_data.s.parameter.batteryCurrentOffset;678 avgValWithOffsetCompensation = newval - sys_data.s.parameter.batteryCurrentOffset; 628 679 // Temperaturabhängiges Offset abziehen 629 680 // in ADC Messwerten mal Abweichung von Referenttemperatur … … 739 790 740 791 741 if (meas_counter > (BATTERY_CURRENT_FILTER *10)) // Nur aktualiseren, wenn es schon ausreichend Messwerte gab742 {792 // if (meas_counter > (BATTERY_CURRENT_FILTER *10)) // Nur aktualiseren, wenn es schon ausreichend Messwerte gab 793 // { 743 794 // höchster und niedrigster Stromwert werden gespeichert 744 795 if(sys_data.s.values.batteryCurrent > sys_data.s.values.batteryCurrentMax) … … 750 801 sys_data.s.values.batteryCurrentMin = sys_data.s.values.batteryCurrent; 751 802 } 752 }803 // } 753 804 754 805 newCurrentValue=1; … … 757 808 } 758 809 810 static uint32_t ADS1260_ProcessBatteryVoltage(int32_t newval) 811 { 812 static signed long avgsum = 0; 813 static int meas_counter; 814 if (meas_counter < INT32_MAX) meas_counter++; 815 //int32_t avgval; 816 817 // Filterlängen in 2er-Potenzen --> Compiler optimiert 818 //avgsum -= avgsum/ BATTERY_CURRENT_FILTER; 819 //avgsum += newval; 820 //avgval = avgsum / BATTERY_CURRENT_FILTER; 821 822 /**********************Offset Kompensation:*******************************/ 823 // Offset abziehen 824 825 826 batteryvoltage = ((newval * (double) 1.5 * BATTERY_VOLTAGE_VOLTAGE_DIVIDER ) / (double)0x800000); 827 sys_data.s.values.batteryVoltage = (batteryvoltage * 1000) - sys_data.s.parameter.batteryVoltageOffset; 828 829 //printf("battery voltage = %.4d V\n", (int32_t) (batteryvoltage*1000)); 830 831 832 833 834 835 836 837 838 return 0; 839 } 840 841 static uint32_t ADS1260_ProcessShuntVoltage(int32_t newval) 842 { 843 844 shuntVoltage = ((newval * (double) 1.5 * SHUNT_VOLTAGE_VOLTAGE_DIVIDER ) / (double)0x800000); 845 sys_data.s.values.shuntVoltage = (shuntVoltage * 1000) - sys_data.s.parameter.shuntVoltageOffset; 846 847 return 0; 848 } 759 849 760 850 // --- GLOBALE FUNKTIONEN - bitte in Header dokumentieren------------------------ … … 788 878 /* 6*/ ADS_1260_SetDataRate(&hspi3, DATA_RATE_20); 789 879 // /* 7*/ ADS_1260_SetDigitalFilter(&hspi1, FILTER_SINC4); 790 /* 8*/ ADS_1260_SetConversionMode(&hspi3, CONVERSION_MODE_ CONTINIOUS);880 /* 8*/ ADS_1260_SetConversionMode(&hspi3, CONVERSION_MODE_PULSE); 791 881 // langsamer 792 882 ADS_1260_SetChopMode(&hspi3, CHOP_MODE_CHOP_MODE); 793 ADS_1260_InputMuxSelect(&hspi3, POS_INPUT_MUX_SELECT_AIN2 + NEG_INPUT_MUX_SELECT_AIN3 );883 ADS_1260_InputMuxSelect(&hspi3, POS_INPUT_MUX_SELECT_AIN2 + NEG_INPUT_MUX_SELECT_AIN3,0); 794 884 795 885 ADS_1260_ActivateStatusData(); 796 886 HAL_IWDG_Refresh(&hiwdg); 797 ADS_1260_ActivateLock();798 HAL_IWDG_Refresh(&hiwdg);887 // ADS_1260_ActivateLock(); 888 // HAL_IWDG_Refresh(&hiwdg); 799 889 800 890 /*10*/ //ADS_1260_SelfOffsetCalibration(&hspi1); … … 804 894 ADS1260_StartConversion(); 805 895 HAL_IWDG_Refresh(&hiwdg); 896 channelInProgress=0; 806 897 } 807 898 … … 810 901 { 811 902 HAL_GPIO_WritePin(ADC_START_CONV_GPIO_Port, ADC_START_CONV_Pin, GPIO_PIN_SET); 903 904 //Vorbereitung aufg nächsten Start 905 812 906 } 813 907 814 908 void ADS1260_ReadConversion(void) 815 909 { 816 extern CRC_HandleTypeDef hcrc;910 817 911 convert_union_t convert; 912 HAL_GPIO_WritePin(ADC_START_CONV_GPIO_Port, ADC_START_CONV_Pin, GPIO_PIN_RESET); 913 818 914 819 915 // CRC2 … … 831 927 uint8_t STATUS_reg = spiDataOut[4]; 832 928 833 if ( (STATUS_reg & (1 << STATUS_LOCK)) &&(STATUS_reg & (1 << STATUS_DRDY)) && !(STATUS_reg & (1 << STATUS_CRCERR)) && !(STATUS_reg & (1 << STATUS_REFL_ALM)))929 if ( (STATUS_reg & (1 << STATUS_DRDY)) && !(STATUS_reg & (1 << STATUS_CRCERR)) && !(STATUS_reg & (1 << STATUS_REFL_ALM))) 834 930 { 835 931 // Rohwerte Byteswitch … … 864 960 } 865 961 866 ADS1260_ProcessCurrent(value); 962 if (channelInProgress==0) 963 { 964 ADS1260_ProcessCurrent(value); 965 ADS_1260_InputMuxSelect(&hspi3, POS_INPUT_MUX_SELECT_AIN4 + NEG_INPUT_MUX_SELECT_AIN5,1); 966 channelInProgress=1; 967 } 968 else if (channelInProgress==1) 969 { 970 ADS1260_ProcessBatteryVoltage(value); 971 ADS_1260_InputMuxSelect(&hspi3, POS_INPUT_MUX_SELECT_AIN6 + NEG_INPUT_MUX_SELECT_AIN7,1); 972 channelInProgress=2; 973 } 974 else if (channelInProgress==2) 975 { 976 ADS1260_ProcessShuntVoltage(value); 977 ADS_1260_InputMuxSelect(&hspi3, POS_INPUT_MUX_SELECT_AIN2 + NEG_INPUT_MUX_SELECT_AIN3,1); 978 channelInProgress=0; 979 } 980 981 ADS1260_StartConversion(); 867 982 } 868 983 … … 1041 1156 } 1042 1157 1158 void ADS1260_BatteryVoltageZeroCal(void) 1159 { 1160 sys_data.s.parameter.batteryVoltageOffset = sys_data.s.values.batteryVoltage + sys_data.s.parameter.batteryVoltageOffset ; 1161 } 1162 1163 void ADS1260_ShuntVoltageZeroCal(void) 1164 { 1165 sys_data.s.parameter.shuntVoltageOffset = sys_data.s.values.shuntVoltage + sys_data.s.parameter.shuntVoltageOffset ; 1166 } 1167 1168 1043 1169 //-----------------------------------------------------------------------------
Note:
See TracChangeset
for help on using the changeset viewer.
