TRUE, ADC_NUM_CHANNELS, adccallback, adcerrorcallback, 0, /* CR1 */ ADC_CR2_SWSTART, /* CR2 */ ADC_SMPR1_SMP_AN10(ADC_SAMPLE_480) | ADC_SMPR1_SMP_AN11(ADC_SAMPLE_480) | ADC_SMPR1_SMP_AN12(ADC_SAMPLE_480) | ADC_SMPR1_SMP_AN13(ADC_SAMPLE_480) | ADC_SMPR1_SMP_AN14(ADC_SAMPLE_480) | ADC_SMPR1_SMP_AN15(ADC_SAMPLE_480), 0, /* SMPR2 */ ADC_SQR1_NUM_CH(ADC_NUM_CHANNELS), 0, (ADC_SQR3_SQ6_N(ADC_AN33_2) | ADC_SQR3_SQ5_N(ADC_AN33_1) | ADC_SQR3_SQ4_N(ADC_AN33_0) | ADC_SQR3_SQ3_N(ADC_6V_SUPPLY) | ADC_SQR3_SQ2_N(ADC_MAIN_SUPPLY) | ADC_SQR3_SQ1_N(ADC_CURRENT_SENS)) }; /* ******************************************************************************* ******************************************************************************* * LOCAL FUNCTIONS ******************************************************************************* ******************************************************************************* */ /* пересчет из условных единиц АЦП в mV */ uint16_t get_comp_secondary_voltage(uint16_t raw){ uint32_t v = 6200; // такое количество милливольт
* ADC conversion group. * Mode: Continuous, 16 samples of 8 channels, SW triggered. * Channels: IN10, IN11, IN10, IN11, IN10, IN11, Sensor, VRef. */ static const ADCConversionGroup adcgrpcfg2 = { TRUE, ADC_GRP2_NUM_CHANNELS, adccallback, adcerrorcallback, 0, ADC_CR2_TSVREFE, /* CR1, CR2 */ ADC_SMPR1_SMP_AN11(ADC_SAMPLE_41P5) | ADC_SMPR1_SMP_AN10(ADC_SAMPLE_41P5) | ADC_SMPR1_SMP_SENSOR(ADC_SAMPLE_239P5) | ADC_SMPR1_SMP_VREF(ADC_SAMPLE_239P5), 0, /* SMPR2 */ ADC_SQR1_NUM_CH(ADC_GRP2_NUM_CHANNELS), ADC_SQR2_SQ8_N(ADC_CHANNEL_SENSOR) | ADC_SQR2_SQ7_N(ADC_CHANNEL_VREFINT), ADC_SQR3_SQ6_N(ADC_CHANNEL_IN11) | ADC_SQR3_SQ5_N(ADC_CHANNEL_IN10) | ADC_SQR3_SQ4_N(ADC_CHANNEL_IN11) | ADC_SQR3_SQ3_N(ADC_CHANNEL_IN10) | ADC_SQR3_SQ2_N(ADC_CHANNEL_IN11) | ADC_SQR3_SQ1_N(ADC_CHANNEL_IN10) }; /* * Red LEDs blinker thread, times are in milliseconds. */ static THD_WORKING_AREA(waThread1, 128); static THD_FUNCTION(Thread1, arg) { (void)arg; chRegSetThreadName("blinker"); while (true) { palClearPad(IOPORT3, GPIOC_LED);
ADC_GRP2_NUM_CHANNELS, adccallback, adcerrorcallback, .u.adc = { 0, /* CR1 */ ADC_CR2_SWSTART, /* CR2 */ 0, /* LTR */ 0, /* HTR */ { /* SMPR[2] */ ADC_SMPR1_SMP_SENSOR(ADC_SAMPLE_239P5) | ADC_SMPR1_SMP_VREF(ADC_SAMPLE_239P5), ADC_SMPR2_SMP_AN9(ADC_SAMPLE_41P5) | ADC_SMPR2_SMP_AN1(ADC_SAMPLE_41P5) }, { /* SQR[3] */ 0, ADC_SQR2_SQ8_N(ADC_CHANNEL_SENSOR) | ADC_SQR2_SQ7_N(ADC_CHANNEL_VBAT), ADC_SQR3_SQ6_N(ADC_CHANNEL_IN9) | ADC_SQR3_SQ5_N(ADC_CHANNEL_IN1) | ADC_SQR3_SQ4_N(ADC_CHANNEL_IN9) | ADC_SQR3_SQ3_N(ADC_CHANNEL_IN1) | ADC_SQR3_SQ2_N(ADC_CHANNEL_IN9) | ADC_SQR3_SQ1_N(ADC_CHANNEL_IN1) } } }; /* * Red LEDs blinker thread, times are in milliseconds. */ static THD_WORKING_AREA(waThread1, 128); static THD_FUNCTION(Thread1, arg) { (void)arg; chRegSetThreadName("blinker"); while (TRUE) {
TRUE, ADC_NUM_CHANNELS, adccallback, adcerrorcallback, 0, /* CR1 */ ADC_CR2_SWSTART, /* CR2 */ ADC_SMPR1_SMP_AN10(ADC_SAMPLE_3) | ADC_SMPR1_SMP_AN11(ADC_SAMPLE_3) | ADC_SMPR1_SMP_AN12(ADC_SAMPLE_3) | ADC_SMPR1_SMP_AN13(ADC_SAMPLE_3) | ADC_SMPR1_SMP_AN14(ADC_SAMPLE_3) | ADC_SMPR1_SMP_AN15(ADC_SAMPLE_3), 0, /* SMPR2 */ ADC_SQR1_NUM_CH(ADC_NUM_CHANNELS), 0, ADC_SQR3_SQ6_N(ADC_AN33_2) | ADC_SQR3_SQ5_N(ADC_AN33_1) | ADC_SQR3_SQ4_N(ADC_AN33_0) | ADC_SQR3_SQ3_N(ADC_6V_SUPPLY) | ADC_SQR3_SQ2_N(ADC_MAIN_SUPPLY) | ADC_SQR3_SQ1_N(ADC_CURRENT_SENS) }; static void adcerrorcallback(ADCDriver *adcp, adcerror_t err) { (void)adcp; (void)err; osalSysHalt(""); } static void adccallback(ADCDriver *adcp, adcsample_t *buffer, size_t n) {
// SMRP1 register content, channels 10, 11, 12, 13 to 71.5 cycles 0xB6D, // SMRP2 register content, channels 0, 1, 2, 3 to 71.5 cycles 0xB6D, // SQR1 register content. Set channel sequence length ADC_SQR1_NUM_CH(ADC_CH_NUM), // SQR2 register content, set to zero for begin (ADC_SQR2_SQ7_N(ADC_CHANNEL_IN10) | ADC_SQR2_SQ8_N(ADC_CHANNEL_IN11)), // SQR3 register content. First 6 channels (ADC_SQR3_SQ1_N(ADC_CHANNEL_IN0 ) | ADC_SQR3_SQ2_N(ADC_CHANNEL_IN1 ) | ADC_SQR3_SQ3_N(ADC_CHANNEL_IN2 ) | ADC_SQR3_SQ4_N(ADC_CHANNEL_IN3 ) | ADC_SQR3_SQ5_N(ADC_CHANNEL_IN12) | ADC_SQR3_SQ6_N(ADC_CHANNEL_IN13)), }; /*-----------------------------------------------------------------------------*/ /** @brief Initialize the ADC1 sub system */ /*-----------------------------------------------------------------------------*/ void vexAdcInit() { // Init and start ADC1 adcInit(); adcStart(&ADCD1, &adccfg); // Start conversions adcStartConversion(&ADCD1, &adccg, &samples_buf[0], 1);
static const ADCConversionGroup adcgrpcfg1 = {FALSE, //circular buffer mode ADC_GRP1_NUM_CHANNELS, //Number of the analog channels NULL, //Callback function (not needed here) 0, //Error callback 0, /* CR1 */ ADC_CR2_SWSTART, /* CR2 */ ADC_SMPR1_SMP_AN10(ADC_SAMPLE_84) | ADC_SMPR1_SMP_AN11(ADC_SAMPLE_84) | ADC_SMPR1_SMP_AN12(ADC_SAMPLE_84) | ADC_SMPR1_SMP_AN13(ADC_SAMPLE_84) | ADC_SMPR1_SMP_AN14(ADC_SAMPLE_84) | ADC_SMPR1_SMP_AN15(ADC_SAMPLE_84), //sample times ch10-18 ADC_SMPR2_SMP_AN0(ADC_SAMPLE_84) | ADC_SMPR2_SMP_AN1(ADC_SAMPLE_84) | ADC_SMPR2_SMP_AN2(ADC_SAMPLE_84) | ADC_SMPR2_SMP_AN3(ADC_SAMPLE_84) | ADC_SMPR2_SMP_AN4(ADC_SAMPLE_84) | ADC_SMPR2_SMP_AN5(ADC_SAMPLE_84) | ADC_SMPR2_SMP_AN6(ADC_SAMPLE_84) | ADC_SMPR2_SMP_AN7(ADC_SAMPLE_84) | ADC_SMPR2_SMP_AN8(ADC_SAMPLE_84) | ADC_SMPR2_SMP_AN9(ADC_SAMPLE_84), //sample times ch0-9 ADC_SQR1_SQ13_N(ADC_CHANNEL_IN12) | ADC_SQR1_SQ14_N(ADC_CHANNEL_IN13) | ADC_SQR1_SQ15_N(ADC_CHANNEL_IN14) | ADC_SQR1_SQ16_N(ADC_CHANNEL_IN15) | ADC_SQR1_NUM_CH(ADC_GRP1_NUM_CHANNELS), //SQR1: Conversion group sequence 13...16 + sequence length ADC_SQR2_SQ7_N(ADC_CHANNEL_IN6) | ADC_SQR2_SQ8_N(ADC_CHANNEL_IN7) | ADC_SQR2_SQ9_N(ADC_CHANNEL_IN8) | ADC_SQR2_SQ10_N(ADC_CHANNEL_IN9) | ADC_SQR2_SQ11_N(ADC_CHANNEL_IN10) | ADC_SQR2_SQ12_N(ADC_CHANNEL_IN11), //SQR2: Conversion group sequence 7...12 ADC_SQR3_SQ1_N(ADC_CHANNEL_IN0) | ADC_SQR3_SQ2_N(ADC_CHANNEL_IN1) | ADC_SQR3_SQ3_N(ADC_CHANNEL_IN2) | ADC_SQR3_SQ4_N(ADC_CHANNEL_IN3) | ADC_SQR3_SQ5_N(ADC_CHANNEL_IN4) | ADC_SQR3_SQ6_N(ADC_CHANNEL_IN5) //SQR3: Conversion group sequence 1...6 }; void adc_convert(void) { adcStopConversion(&ADCD1); adcStartConversion(&ADCD1, &adcgrpcfg1, adcvalues, ADC_GRP1_BUF_DEPTH); }