cancel
Showing results for 
Search instead for 
Did you mean: 

STM32H7 DAC sinewave generate using formular

SEng.1
Associate II

I'm success create sinewave signal by using table:

uint32_t Wave_LUT[NS] = {
    2048, 2149, 2250, 2350, 2450, 2549, 2646, 2742, 2837, 2929, 3020, 3108, 3193, 3275, 3355,
    3431, 3504, 3574, 3639, 3701, 3759, 3812, 3861, 3906, 3946, 3982, 4013, 4039, 4060, 4076,
    4087, 4094, 4095, 4091, 4082, 4069, 4050, 4026, 3998, 3965, 3927, 3884, 3837, 3786, 3730,
    3671, 3607, 3539, 3468, 3394, 3316, 3235, 3151, 3064, 2975, 2883, 2790, 2695, 2598, 2500,
    2400, 2300, 2199, 2098, 1997, 1896, 1795, 1695, 1595, 1497, 1400, 1305, 1212, 1120, 1031,
    944, 860, 779, 701, 627, 556, 488, 424, 365, 309, 258, 211, 168, 130, 97,
    69, 45, 26, 13, 4, 0, 1, 8, 19, 35, 56, 82, 113, 149, 189,
    234, 283, 336, 394, 456, 521, 591, 664, 740, 820, 902, 987, 1075, 1166, 1258,
    1353, 1449, 1546, 1645, 1745, 1845, 1946, 2047
};
 
HAL_DAC_Start_DMA(&hdac1, DAC_CHANNEL_1, Wave_LUT, NS, DAC_ALIGN_12B_R);

but when i try create my own list from formula and got weird result:

#define NS	128
 
uint32_t IV[NS];
uint16_t value;
 
void calsine()
{
	for(int i = 0 ; i < NS ; i++)
	{
		value =  (uint16_t)rint((sinf(((2*M_PI)/NS)*i)+1)*2048);
		IV[i] = value < 4096 ? value : 4095;
	}
}
 
HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_2, (uint32_t*)IV, NS, DAC_ALIGN_12B_R);

Any pointer where i got wrong?

10 REPLIES 10

> All the code exactly the same except one using lookup table and another is calculated.

If it's exactly the same, then the result would be exactly the same. So you have to find what are the differences.

You generate the waveform only once at startup, correct? And the array is placed in the same RAM with the same alignment?

In the code snippet you posted above, IV[] is declared as uint32_t

uint32_t IV[NS];

yet in the values printout above for IV elements it says uint16_t, why?

> I'm using onboard ADC

That might be part of the problem - you combine two unknowns. Observe DAC output using oscilloscope; input to ADC an externally generated signal.

JW