2014-07-14 03:19 AM
Hello,
I have a trouble with my DAC, for example when I set the DAC output (Channel1 orChannel2) to the maximum voltage, the DAC generate the minimum voltage:DAC_SetChannel1Data(DAC_Align_12b_R, 4095);
Vout
~
0VDAC_SetChannel1Data(DAC_Align_12b_R, 0);
Vout
~
3.3VDAC_SetChannel1Data(DAC_Align_12b_R, 1000);
Vout
~
0.8V The strange thing is, I have two test boards, and the problem happens only on one board. The other board have a correct behavior, with the same project! Do you have any ideas? Thanks a lot!DAC_SetChannel1Data(DAC_Align_12b_R, 4095);
Vout
~
0VDAC_SetChannel1Data(DAC_Align_12b_R, 4095);
Vout
~
0V #whiskey-tango-foxtrot #oscar-mike-golf2014-07-14 03:44 AM
Are you sure you are measuring correctly ?
Connecting the input of the measuring device to the 3.3V supply, and Ground to the DAC output, you would surely measure an ''inverse'' output. Or have you added an inverting opamp as buffer amplifier ?2014-07-14 05:14 AM
No, I measure the direct output pin of the STM32F4, and I'm sure of my method :)
And the same test on the other board, the good result...Maybe it's a hardware failure into the STM32 DAC, for example maybe I created a short circuit during a test and now the DAC is ''destroyed''? But DAC are protected isn'nt it?2014-07-14 06:50 AM
Maybe it's a hardware failure into the STM32 DAC, for example maybe I created a short circuit during a test and now the DAC is ''destroyed''? But DAC are protected isn'nt it?
Probably only by it's high output impedance, which presumably prevents any substantial current flow. But there is no documented way to achieve such an ''inverse'' output. Perhaps there is something wrong with the voltage reference (shared with the ADC) ?
2014-07-14 08:45 AM
Perhaps there is something wrong with the voltage reference (shared with the ADC) ?
I don't think, I have a nice 3.3V on each votage references (including VREF+ and VDDA)...DAC_SetChannel1Data(DAC_Align_12b_R, 4095);
Vout
~
0VDAC_SetChannel1Data(DAC_Align_12b_R, 4095);
Vout
~
0V2014-07-14 08:58 AM
Make sure you have fully populated any configuration parameters/structures.
But DAC are protected isn'nt it? If evaporating silicon acting as a fuse is classed as ''protection''. The ESD diodes may try to clamp to the supply, but aren't current limiting and recoverable like a poly-fuse. Causing the pin to invert doesn't really sound plausible.2014-07-15 01:38 AM
Hi,
I test my ADCs and they are working well. This is my ADC config:void
DAC_Config(
void
)
{
/* Preconfiguration before using DAC----------------------------------------*/
GPIO_InitTypeDef GPIO_InitStructure;
/* DMA1 clock and GPIOA clock enable (to be used with DAC) */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1 | RCC_AHB1Periph_GPIOA, ENABLE);
/* DAC Periph clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
DAC_InitStructure.DAC_Trigger = DAC_Trigger_None;
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable;
DAC_StructInit(&DAC_InitStructure);
/* DAC channel 1 & 2 (DAC_OUT1 = PA.4)(DAC_OUT2 = PA.5) configuration */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
DAC_DeInit();
}
void
Set_DAC_Ch1_Voltage(
float
voltage)
{
/* DAC channel1 Configuration */
DAC_InitStructure.DAC_Trigger = DAC_Trigger_None;
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable;
DAC_Init(DAC_Channel_1, &DAC_InitStructure);
/* Enable DAC Channel1 */
DAC_Cmd(DAC_Channel_1, ENABLE);
/* Set DAC channel1 DHR12RD register */
DAC_SetChannel1Data(DAC_Align_12b_R, voltage);
}
Not sure if it's a good init but it's working well for my other board...
2014-07-15 02:10 AM
First, you do not need to configure the DAC each time you want to set a value. This just wastes time.
This line should throw at least a compiler warning:DAC_SetChannel1Data(DAC_Align_12b_R, voltage);
The voltage parameter is float, but
DAC_SetChannel1Data
() expects an uint
No wonder you get those strange results. A simple cast, probably with scaling, should suffice here.
2014-07-15 03:03 AM
First, you do not need to configure the DAC each time you want to set a value. This just wastes time.
Done, thanks! This line should throw at least a compiler warning:
DAC_SetChannel1Data(DAC_Align_12b_R, voltage);
The voltage parameter is float, but
DAC_SetChannel1Data
() expects an uint
No wonder you get those strange results. A simple cast, probably with scaling, should suffice here.
Done, in fact it was just a try. But my problem is still here... Now I really think that it's a hardware problem, I probably created a short circuit on the output analog pin during a test under voltage. Maybe hardware designer from ST would know what happened...2014-07-15 04:17 AM
But my problem is still here... Now I really think that it's a hardware problem, I probably created a short circuit on the output analog pin during a test under voltage. Maybe hardware designer from ST would know what happened...
If your 'problematic' board and the reference board are identical in both software and hardware, and still behave differently, it might well be a hardware problem. And it might be worth trying to ask ST, albeit I'm not sure if they are interested. Have you tried the other DAC channel/output instead, does it behave the same way ?