2021-09-16 09:40 PM
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?
2021-09-19 03:04 AM
> 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