Контролеер STM32F4, среда CoIDE, включен HARD FPU.
Есть такая вот структура:
Код
typedef struct{
char Mode;
uint16_t Amplitude; //4095
uint16_t Freqency;
uint16_t Discreteness; //10000
uint8_t Periods;
uint8_t Waveform;
float Attenuation; //1
int16_t SignalData[10000];
}ModeStructTypeDef;
Тут заполняется массив SignalData[]:
Код
for (i = 0; i < ModeStruct->Discreteness; i++)
{
ModeStruct->SignalData[i] = (int16_t)roundf((sinf(M_TWOPI * i / 10000) * (ModeStruct->Amplitude / 2)));
}
Тут провожу некоторые вычисления и после этого выдаю данные на ЦАП:
Код
uint16_t data = ((uint16_t)roundf((float)ModeStruct.SignalData[step_counter] / ModeStruct.Attenuation)) + (ModeStruct.Amplitude / 2);
Проблема следующая... Как видно из кода, он генерирует синусоиду с нужными мне параметрами на выходе ЦАП. При заполнении массива проблем не возникает, заполняется числами, соответствующими синусоиде с амплитудой от -2047 до 2047. А вот при дальнейшей обработке есть проблема: с положительной полуволной всё нормально (умножается на коэффициэнт затухания, увеличивается на 2047), а вот в отрицательной полуволне все значения = 2047, то есть где-то здесь ((uint16_t)roundf((float)ModeStruct.SignalData[step_counter] / ModeStruct.Attenuation)) отрицательные значения превращаются в 0. Подскажите пожалуйста, что я делаю не так.