#include "main.h" #include #define POINTS 128 // Степень двойки удобнее для памяти #define PI 3.1415926F // Выравниваем массив по 4 байта, чтобы DMA не ошибся с адресом uint16_t DualSineWave[POINTS]; // Функция для простой проверки (Генерирует "Пилу") // Если с синусом беда - раскомментируйте вызов этой функции в main void Calc_Sawtooth(void) { for (int i = 0; i < POINTS; i++) { // Просто линейный рост от 0 до 4095 DualSineWave[i] = (uint16_t)((i * 4095) / POINTS); } } // Функция по заданию (Синус + гармоника) void Calc_ComplexWave(void) { for (int i = 0; i < POINTS; i++) { float t = (float)i / POINTS * 2 * PI; // V = sin(t) + 0.5 * sin(2t) float val = sinf(t) + 0.5f * sinf(2.0f * t); // Масштабируем: диапазон формулы от -1.3 до +1.3 (примерно) // Сдвигаем на +1.5 и умножаем, чтобы влезть в 0..4095 float scaled = (val + 1.5f) * (4000.0f / 3.0f); // Жесткое ограничение (Clamping), чтобы убрать "выбросы" if (scaled > 4095.0f) scaled = 4095.0f; if (scaled < 0.0f) scaled = 0.0f; DualSineWave[i] = (uint16_t)scaled; } } void Delay_Loop(volatile uint32_t count) { while(count--) {} } int main(void) { SystemInit(); // На всякий случай обновляем частоты // --- ВЫБОР РЕЖИМА --- Calc_ComplexWave(); // По заданию // Calc_Sawtooth(); // <-- Раскомментируйте, если видите шум. Должна быть ровная пила. // Инициализация LEDs_ini(); // Чтобы видеть, что МК работает GPIO_Ini(); DMA_Ini(DualSineWave, POINTS); DAC_Ini(); TIM_Ini(); while(1) { // Мигаем светодиодом (PD12 - Зеленый), чтобы видеть, что плата не висит GPIO_ToggleBits(GPIOD, GPIO_Pin_12); Delay_Loop(5000000); } }