cancel
Showing results for 
Search instead for 
Did you mean: 

How to get second DAC working on F072RB board

KKoem.1
Associate II

I'm working on a simple, bare metal application where right now I am passing in values read from the two ADCs and then write the same values to the corresponding DACs. I have confirmed by stepping through the code and using a volt meter.

The configuration of the DAC is as follows:

static void MX_DAC_Init(void)

{

 /* USER CODE BEGIN DAC_Init 0 */

 /* USER CODE END DAC_Init 0 */

 DAC_ChannelConfTypeDef sConfig = {0};

 /* USER CODE BEGIN DAC_Init 1 */

 /* USER CODE END DAC_Init 1 */

 /** DAC Initialization 

 */

 hdac.Instance = DAC;

 if (HAL_DAC_Init(&hdac) != HAL_OK)

 {

  Error_Handler();

 }

 /** DAC channel OUT1 config 

 */

 sConfig.DAC_Trigger = DAC_TRIGGER_NONE;

 sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;

 if (HAL_DAC_ConfigChannel(&hdac, &sConfig, DAC_CHANNEL_1) != HAL_OK)

 {

  Error_Handler();

 }

 /** DAC channel OUT2 config 

 */

 if (HAL_DAC_ConfigChannel(&hdac, &sConfig, DAC_CHANNEL_2) != HAL_OK)

 {

  Error_Handler();

 }

 /* USER CODE BEGIN DAC_Init 2 */

 /* USER CODE END DAC_Init 2 */

}

My pass through function is as follows:

void PassThrough(void)

{

  uint16_t value;

  HAL_ADC_Start(&hadc);

  HAL_ADC_PollForConversion(&hadc, HAL_MAX_DELAY);

  value = HAL_ADC_GetValue(&hadc);

  HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, value);

  HAL_ADC_Start(&hadc);

  HAL_ADC_PollForConversion(&hadc, HAL_MAX_DELAY);

  value = HAL_ADC_GetValue(&hadc);

  HAL_DAC_SetValue(&hdac, DAC_CHANNEL_2, DAC_ALIGN_12B_R, value);

}

The value in DAC2 _OUT is garbage. There is something fundamentally incorrect in the configuration. I've tried figuring it out by searching online and in the samples that I downloaded. Any times greatly appreciated.

1 ACCEPTED SOLUTION

Accepted Solutions

By "read out and check" I mean, check yourself, against the expected values based on reading the given (DAC) chapter in Reference Manual (RM).

DAC_CR is 0x0001, i.e. you don't have enabled DAC2 (DAC_CR.EN2 = 0).

JW

View solution in original post

7 REPLIES 7

> The value in DAC2 _OUT is garbage.

What do you mean by garbage? Read out and check/post the DAC registers' content, explaining how do they depart from the expectations.

JW

0693W000003ByrVQAS.jpgHi JW,

By garbage I mean that the voltage read on my voltmeter does not match the value read from the ADC that I pass to it. I'm quite new to this, so please excuse dumb responses to your questions. I did a screen grab.

At the first ADC, the input voltage is 4.95V which is read as a value of 4000 (0xFA0). This is written to the first DAC, and a value of 4.89 V is read back (close enough). On the second ADC, the input voltage is 2.37 V which is read as a value of 1855 (0x73F), but I read 0.68 Volts.

Did I display the contents of the DAC register correctly?

Thanks,

KKoem1

By "read out and check" I mean, check yourself, against the expected values based on reading the given (DAC) chapter in Reference Manual (RM).

DAC_CR is 0x0001, i.e. you don't have enabled DAC2 (DAC_CR.EN2 = 0).

JW

Inputs not rates for near 5V operation

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..

I'm sorry, I don't understand your comment.

JW,

Got it and I see the issue where the DAC_CR.EN2 is 0: bit 16 in 14.10.1 in the RM0091 for the STM32f0x2 (and others).

I'm scratching my head as I'm comparing to other sample code I'm finding online.

The HAL function is a bit of a mystery. I would assume that the clocks/registers would be enabled via the code I showed above.

Would you recommend against using the Hal functions and instead enable the register directory? I was using the STMCubeMX to generate some of the code.

Thanks,

K

> Would you recommend against using the Hal functions

By using *any* "library" you accept its limitations. The "library" has been written with some usage in mind, and expects to be used in some certain way. Cube/HAL caters for the "most usual" cases. Users often find, that Cube/HAL is providing great value as long as you don't depart from the "usual cases"; departing from that appears to result in ordeal. Many users try to bend Cube/HAL to their purpose, or combine it with other approaches.

One could also expect a certain level of documentation. And of course one may hit bugs and errors.

The ultimate decision is yours.

I don't Cube.

JW