Page 1 of 2

missing part mcuconf.h stm072 discovery

Posted: Fri Mar 11, 2016 4:50 pm
by enrico.dallavia
Hi,
I had to use DAC but there is a loss in the mcuconf.h that comes with ChibiOs 4 (I don't know for previous release)
in order to compile with DAC enabled I had to add the following rows

Code: Select all

 /*
 * DAC driver system settings.
 */
#define STM32_DAC_DUAL_MODE                 FALSE
#define STM32_DAC_USE_DAC1_CH1              TRUE
#define STM32_DAC_USE_DAC1_CH2              TRUE
#define STM32_DAC_DAC1_CH1_IRQ_PRIORITY     10
#define STM32_DAC_DAC1_CH2_IRQ_PRIORITY     10
#define STM32_DAC_DAC1_CH1_DMA_PRIORITY     2
#define STM32_DAC_DAC1_CH2_DMA_PRIORITY     2
#define STM32_DAC_DAC1_CH1_DMA_STREAM       STM32_DMA_STREAM_ID(1, 3)
#define STM32_DAC_DAC1_CH2_DMA_STREAM       STM32_DMA_STREAM_ID(1, 4)

Hope nothing was wrong with them

Re: missing part mcuconf.h stm072 discovery

Posted: Fri Mar 11, 2016 5:07 pm
by Giovanni
I will look into this.

Giovanni

Re: missing part mcuconf.h stm072 discovery

Posted: Fri Mar 11, 2016 5:14 pm
by enrico.dallavia
I have a question, I look inside the example of DAC but every one generates a waveform on output.
If I need to give a constant value, (constant is intened as I need to change the value very few times in a time of 10 minutes driven by external events) to 2 DAC output with different values.
Can I do something like

Code: Select all

dacStartConversion(&DACD1, &dacgrpcfg1, dac_buffer, 1);// dac_buffer is a 1 element long
//....
while(true){
   if(condition){
     dacStopConversion(&DACD1);
     //load new value
    dacStartConversion(&DACD1, &dacgrpcfg1, dac_buffer, 1);
  }
}


with a configuration like this (for 1 output)

Code: Select all

static const DACConversionGroup dacgrpcfg1 = {
  .num_channels = 1U,
  .end_cb       = NULL,
  .error_cb     = NULL,
  .trigger      = DAC_TRG_SW
};



how to manage two output?


thanks

Re: missing part mcuconf.h stm072 discovery

Posted: Fri Mar 11, 2016 5:26 pm
by Giovanni
Try dacPutChannelX().

Giovanni

Re: missing part mcuconf.h stm072 discovery

Posted: Fri Mar 11, 2016 5:31 pm
by enrico.dallavia
If I want also to enable the buffer to feed the output directly to other devices, is there any configuration or instruction inside the chibios's driver to do that (I'm talking about BOFF1 field inside DAC_CR register)

Re: missing part mcuconf.h stm072 discovery

Posted: Fri Mar 11, 2016 5:32 pm
by enrico.dallavia
Thanks Giovanni!

/**
* @brief Outputs a value directly on a DAC channel.
*
* @param[in] dacp pointer to the @p DACDriver object
* @param[in] channel DAC channel number
* @param[in] sample value to be output
*
* @xclass
*/
void dacPutChannelX(DACDriver *dacp, dacchannel_t channel, dacsample_t sample)

it is what I need!!!!

Re: missing part mcuconf.h stm072 discovery

Posted: Fri Mar 11, 2016 6:06 pm
by enrico.dallavia
I have a problem,
I can increase and decrease only channel 0 on PA4, if I call

Code: Select all

dacPutChannelX(&DACD1,1,dac_ref);


the output of PA5 does not change (even if both PA4 and PA5 are set as analog)

inside mcuconf.h I have

Code: Select all

#define STM32_DAC_DUAL_MODE                 FALSE
#define STM32_DAC_USE_DAC1_CH1              TRUE
#define STM32_DAC_USE_DAC1_CH2              TRUE


Any suggestions?

Thanks

Re: missing part mcuconf.h stm072 discovery

Posted: Sun Mar 13, 2016 12:43 pm
by Giovanni
Mcuconf.h files have been fixed.

Not sure about the issue, that function just writes into the data registers.

Giovanni

Re: missing part mcuconf.h stm072 discovery

Posted: Mon Mar 14, 2016 9:59 am
by enrico.dallavia
Found the problem!
I had to initialize DADC2 and use channel 1 when I have to use it.

As a very simple example to drive the 2 independent DAC (using stm072 discovery)

Code: Select all

static const DACConfig dac1cfg1 = {
  .init         = 0U,
  .datamode     = DAC_DHRM_12BIT_RIGHT
};

/*
 * Application entry point.
 */
int main(void) {

  /*
   * System initializations.
   * - HAL initialization, this also initializes the configured device drivers
   *   and performs the board-specific initializations.
   * - Kernel initialization, the main() function becomes a thread and the
   *   RTOS is active.
   */
  halInit();
  chSysInit();

   palSetPadMode(GPIOA, 4, PAL_MODE_INPUT_ANALOG);
   palSetPadMode(GPIOA, 5, PAL_MODE_INPUT_ANALOG);

  dacStart(&DACD1, &dac1cfg1);
  dacStart(&DACD2, &dac1cfg1);
  dacsample_t dac_ref = 0;

  dacPutChannelX(&DACD1,0,dac_ref);
  dacPutChannelX(&DACD2,1,dac_ref);

  while (true) {
    if (palReadPad(GPIOA, GPIOA_BUTTON)){
        dac_ref+=100;
        dacPutChannelX(&DACD1,0,dac_ref);
        dacPutChannelX(&DACD2,1,dac_ref);
    }
    chThdSleepMilliseconds(250);
  }
}



My mistakes were:
1) try to pilot 2nd channel with dacPutChannelX(&DACD1,1,dac_ref);
2) try to pilot 2nd channel with dacPutChannelX(&DACD2,0,dac_ref);

Now I can see at oscilloscope both channel working fine!
Thanks!

If I have to use buffer (set BOFF1 in DAC_CR register) to pilot something without any op amp in the middle, do I have to manage the register manually or is there any hal chibios for that?

Re: missing part mcuconf.h stm072 discovery

Posted: Mon Mar 14, 2016 10:14 am
by Giovanni
Hi,

Currently it is not possible to set BOFF, it will require a change. You can change the CR register after calling dacStart().

Giovanni