static void get_adc_config (uint32_t config[4]) { config[2] = ADC_SQR1_NUM_CH(2); switch (SYS_BOARD_ID) { case BOARD_ID_FST_01: config[0] = 0; config[1] = ADC_SMPR2_SMP_AN0(ADC_SAMPLE_1P5) | ADC_SMPR2_SMP_AN9(ADC_SAMPLE_1P5); config[3] = ADC_SQR3_SQ1_N(ADC_CHANNEL_IN0) | ADC_SQR3_SQ2_N(ADC_CHANNEL_IN9); break; case BOARD_ID_OLIMEX_STM32_H103: case BOARD_ID_STBEE: config[0] = ADC_SMPR1_SMP_AN10(ADC_SAMPLE_1P5) | ADC_SMPR1_SMP_AN11(ADC_SAMPLE_1P5); config[1] = 0; config[3] = ADC_SQR3_SQ1_N(ADC_CHANNEL_IN10) | ADC_SQR3_SQ2_N(ADC_CHANNEL_IN11); break; case BOARD_ID_STBEE_MINI: config[0] = 0; config[1] = ADC_SMPR2_SMP_AN1(ADC_SAMPLE_1P5) | ADC_SMPR2_SMP_AN2(ADC_SAMPLE_1P5); config[3] = ADC_SQR3_SQ1_N(ADC_CHANNEL_IN1) | ADC_SQR3_SQ2_N(ADC_CHANNEL_IN2); break; case BOARD_ID_CQ_STARM: case BOARD_ID_FST_01_00: case BOARD_ID_MAPLE_MINI: case BOARD_ID_STM32_PRIMER2: case BOARD_ID_STM8S_DISCOVERY: case BOARD_ID_ST_DONGLE: case BOARD_ID_ST_NUCLEO_F103: case BOARD_ID_NITROKEY_START: default: config[0] = 0; config[1] = ADC_SMPR2_SMP_AN0(ADC_SAMPLE_1P5) | ADC_SMPR2_SMP_AN1(ADC_SAMPLE_1P5); config[3] = ADC_SQR3_SQ1_N(ADC_CHANNEL_IN0) | ADC_SQR3_SQ2_N(ADC_CHANNEL_IN1); break; } }
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; // такое количество милливольт uint32_t adc = 770;// приходится на такое количество условных единиц return (uint16_t)(((uint32_t)raw * v) / adc);
/*===========================================================================*/ /* Driver local variables. */ /*===========================================================================*/ static const TouchscreenDriver *ts; static const ADCConversionGroup adc_y_config = { FALSE, ADC_NUM_CHANNELS, NULL, NULL, 0, 0, 0, 0, ADC_SQR1_NUM_CH(ADC_NUM_CHANNELS), 0, ADC_SQR3_SQ2_N(ADC_CHANNEL_IN12) | ADC_SQR3_SQ1_N(ADC_CHANNEL_IN13) }; static const ADCConversionGroup adc_x_config = { FALSE, ADC_NUM_CHANNELS, NULL, NULL, 0, 0, 0, 0, ADC_SQR1_NUM_CH(ADC_NUM_CHANNELS), 0, ADC_SQR3_SQ2_N(ADC_CHANNEL_IN10) | ADC_SQR3_SQ1_N(ADC_CHANNEL_IN11) }; /**
* 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); chThdSleepMilliseconds(500); palSetPad(IOPORT3, GPIOC_LED);
*/ static const ADCConversionGroup adc_grpcfg = { TRUE, ADC_NUM_CHANNELS, NULL, NULL, 0, /* CR1 */ ADC_CR2_SWSTART, /* CR2 */ ADC_SMPR1_SMP_AN15(ADC_SAMPLE_144) | ADC_SMPR1_SMP_AN14(ADC_SAMPLE_144) | ADC_SMPR1_SMP_AN12(ADC_SAMPLE_144) | ADC_SMPR1_SMP_AN11(ADC_SAMPLE_144), /* SMPR1 */ 0, /* SMPR2 */ ADC_SQR1_NUM_CH(ADC_NUM_CHANNELS), 0, /* SQR2 */ ADC_SQR3_SQ4_N(ADC_CHANNEL_IN15) | ADC_SQR3_SQ3_N(ADC_CHANNEL_IN14) | ADC_SQR3_SQ2_N(ADC_CHANNEL_IN12) | ADC_SQR3_SQ1_N(ADC_CHANNEL_IN11) }; static WORKING_AREA(irWorkingArea, 1024); /* ICU callbacks and data to be used with sonars */ /* Thread used for read data from sonar */ static msg_t irThread(void *arg) { (void) arg; char buf[40]; /* * Activates the ADC1 driver. */ adcStart(&ADCD1, NULL);
* Channels: IN11 (48 cycles sample time) * Sensor (192 cycles sample time) */ static const ADCConversionGroup adcgrpcfg = { FALSE, ADC_GRP1_NUM_CHANNELS, adccb, NULL, /* HW dependent part.*/ 0, ADC_CR2_SWSTART, ADC_SMPR1_SMP_AN11(ADC_SAMPLE_56) | ADC_SMPR1_SMP_SENSOR(ADC_SAMPLE_144), 0, ADC_SQR1_NUM_CH(ADC_GRP1_NUM_CHANNELS), 0, ADC_SQR3_SQ2_N(ADC_CHANNEL_IN11) | ADC_SQR3_SQ1_N(ADC_CHANNEL_SENSOR) }; /* * PWM configuration structure. * Cyclic callback enabled, channels 1 and 4 enabled without callbacks, * the active state is a logic one. */ static PWMConfig pwmcfg = { 10000, /* 10KHz PWM clock frequency. */ 10000, /* PWM period 1S (in ticks). */ pwmpcb, { {PWM_OUTPUT_ACTIVE_HIGH, NULL}, {PWM_OUTPUT_DISABLED, NULL}, {PWM_OUTPUT_DISABLED, NULL},
* Mode: Continuous, 16 samples of 2 channels, HS triggered by * GPT4-TRGO. * Channels: Sensor, VRef. */ static const ADCConversionGroup adcgrpcfg1 = { true, ADC_GRP1_NUM_CHANNELS, adccallback, adcerrorcallback, 0, /* CR1 */ ADC_CR2_EXTEN_RISING | ADC_CR2_EXTSEL_SRC(12), /* CR2 */ ADC_SMPR1_SMP_SENSOR(ADC_SAMPLE_144) | ADC_SMPR1_SMP_VREF(ADC_SAMPLE_144), 0, /* SMPR2 */ ADC_SQR1_NUM_CH(ADC_GRP1_NUM_CHANNELS), /* SQR1 */ 0, /* SQR1 */ ADC_SQR3_SQ2_N(ADC_CHANNEL_SENSOR) | ADC_SQR3_SQ1_N(ADC_CHANNEL_VREFINT) }; /*===========================================================================*/ /* Application code. */ /*===========================================================================*/ /* * This is a periodic thread that does absolutely nothing except flashing * a LED attached to TP1. */ static THD_WORKING_AREA(waThread1, 128); static THD_FUNCTION(Thread1, arg) { (void)arg; chRegSetThreadName("blinker");
ADC_GRP1_NUM_CHANNELS, NULL, adcerrorcallback, .u.adc = { 0, /* CR1 */ ADC_CR2_SWSTART, /* CR2 */ 0, /* LTR */ 0, /* HTR */ { /* SMPR[2] */ 0, ADC_SMPR2_SMP_AN9(ADC_SAMPLE_41P5) | ADC_SMPR2_SMP_AN1(ADC_SAMPLE_41P5), }, { /* SQR[3] */ 0, 0, ADC_SQR3_SQ2_N(ADC_CHANNEL_IN9) | ADC_SQR3_SQ1_N(ADC_CHANNEL_IN1) } } }; /* * ADC conversion group. * Mode: Continuous, 16 samples of 8 channels, SW triggered. * Channels: IN1, IN9, IN1, IN9, IN1, IN9, VBat, Sensor. */ static const ADCConversionGroup adcgrpcfg2 = { TRUE, ADC_GRP2_NUM_CHANNELS, adccallback, adcerrorcallback, .u.adc = {
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) { (void)adcp; (void)buffer; (void)n; ints++;
// ADC_SAMPLE_239P5 static const ADCConversionGroup adcGroup = { TRUE, ADC_NUM_CHANNELS, contAdcReadyCb, NULL, 0, 0, /* CR1, CR2 */ 0, ADC_SMPR2_SMP_AN2(ADC_SAMPLE_13P5) | ADC_SMPR2_SMP_AN3( ADC_SAMPLE_13P5 ) | ADC_SMPR2_SMP_AN4( ADC_SAMPLE_13P5 ), ADC_SQR1_NUM_CH( ADC_NUM_CHANNELS ), 0, ADC_SQR3_SQ1_N(ADC_CHANNEL_IN2) | ADC_SQR3_SQ2_N(ADC_CHANNEL_IN3) | ADC_SQR3_SQ3_N(ADC_CHANNEL_IN4) }; static PWMConfig pwmCfg = { 48000000, // 1000kHz PWM clock frequency. 480, // Initial PWM period 10us. NULL, { { PWM_OUTPUT_ACTIVE_HIGH, NULL }, { PWM_OUTPUT_ACTIVE_HIGH, NULL }, { PWM_OUTPUT_DISABLED, NULL }, { PWM_OUTPUT_DISABLED, NULL } }, 0,
adccallback, // end_conversion_cb adcerrorcallback, //error_cb 0, /* CR1 */ ADC_CR2_SWSTART, /* CR2 */ ADC_SMPR1_SMP_AN14(ADC_OVERSAMPLING) | ADC_SMPR1_SMP_AN15(ADC_OVERSAMPLING), // SMPR1 ADC_SMPR2_SMP_AN4(ADC_OVERSAMPLING) | ADC_SMPR2_SMP_AN5(ADC_OVERSAMPLING) | /* SMPR2 */ ADC_SMPR2_SMP_AN6(ADC_OVERSAMPLING) | ADC_SMPR2_SMP_AN7(ADC_OVERSAMPLING) | /* SMPR2 */ ADC_SMPR2_SMP_AN9(ADC_OVERSAMPLING), /* SMPR2 */ ADC_SQR1_NUM_CH(ADC_ADC3_NUM_CHANNELS), // SQR1 0, //SQR2 ADC_SQR3_SQ1_N(GPIOF_ADC_CMD_TURRET_CHANNEL) | //SQR3 ADC_SQR3_SQ2_N(GPIOF_ADC_CMD_ELBOW_CHANNEL) | //SQR3 ADC_SQR3_SQ3_N(GPIOF_ADC_CMD_SHOULDER_CHANNEL) | //SQR3 ADC_SQR3_SQ4_N(GPIOF_ADC_CMD_WRIST_CHANNEL) | //SQR3 ADC_SQR3_SQ5_N(GPIOF_ADC_CMD_CLAMP_CHANNEL) //SQR3 }; #ifndef __COVERITY__ _Static_assert(CMD_TURRET_ADC_IDX == 3, "ADC mismatch"); _Static_assert(CMD_SHOULDER_ADC_IDX == 3, "ADC mismatch"); _Static_assert(CMD_ELBOW_ADC_IDX == 3, "ADC mismatch"); _Static_assert(CMD_WRIST_ADC_IDX == 3, "ADC mismatch"); _Static_assert(CMD_CLAMP_ADC_IDX == 3, "ADC mismatch"); #endif #else #error "one board has to be defined"
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); }
/* FX inputs conversion group */ static const ADCConversionGroup adc_con_group_2 = { TRUE, /* circular mode */ 3, /* number of channels in this con group */ adc_fx_callback, adc_error_callback, 0, /* cr1 */ /* cr2: Clock the ADC to timer 3 TRGO event*/ ADC_CR2_EXTSEL_SRC(8) | ADC_CR2_EXTEN_0, /* smpr1+2: set all channels to 40 cycles per conversion (28+12) */ ADC_SMPR1_SMP_AN11(2)| ADC_SMPR1_SMP_AN12(2)| ADC_SMPR1_SMP_AN13(2), ADC_SMPR2_SMP_AN0(2) | ADC_SMPR2_SMP_AN1(2) | ADC_SMPR2_SMP_AN2(2), ADC_SQR1_NUM_CH(3), /* sqr1: set 3 channels in the group */ 0, /* sqr2: no higher channels being sampled */ /* sqr3: set the channels to sample */ ADC_SQR3_SQ1_N(FX_1_CHN) | ADC_SQR3_SQ2_N(FX_2_CHN) | ADC_SQR3_SQ3_N(FX_3_CHN) }; /* DAC config for DAC1 */ static const DACConfig dac_cfg = { .init = 0, .datamode = DAC_DHRM_12BIT_RIGHT, }; /* DAC output conversion group */ static const DACConversionGroup dac_conv_grp = { .num_channels = 1U, .end_cb = dac_end_callback, .error_cb = dac_error_callback, .trigger = DAC_TRG(1), // Trigger off TIM8 TRGO
ADC_SQR3_SQ1_N(ADC_CHANNEL_IN4) }; static const ADCConversionGroup adcgrp2cfg = { FALSE, ADC_GRP2_NUM_CHANNELS, adccb3, NULL, /* HW dependent part.*/ 0, ADC_CR2_SWSTART, 0, ADC_SMPR2_SMP_AN4(ADC_SAMPLE_112) | ADC_SMPR2_SMP_AN5(ADC_SAMPLE_112), ADC_SQR1_NUM_CH(ADC_GRP2_NUM_CHANNELS), 0, ADC_SQR3_SQ2_N(ADC_CHANNEL_IN4) | ADC_SQR3_SQ1_N(ADC_CHANNEL_IN5) }; // Global variables static adcsample_t InputSamples[ADC_GRP2_NUM_CHANNELS * ADC_GRP2_BUF_DEPTH]; static adcsample_t vertFeedbackSample[ADC_GRP1_NUM_CHANNELS * ADC_GRP1_BUF_DEPTH]; static adcsample_t latFeedbackSample[ADC_GRP1_NUM_CHANNELS * ADC_GRP1_BUF_DEPTH]; uint8_t U8EnableDriveSwitch = 0; uint8_t U8PrevPosnVelModeSwitchState = 0; uint8_t U8ShellEnable = 0; uint8_t U8ShellMode = 2; //uint8_t U8trackupflag = 0;