vagrantnotes
@vagrantnotes
Embedded-разработчик

Как правильно задать частоту прерываний для вывода звука через ЦАП микроконтроллера?

Господа, столкнулся с необычной проблемой и нуждаюсь в помощи и совете.

Задача: вывести WAV-файл в DAC-канал микроконтроллера (работаю с платой STM32F4discovery). Задача тривиальная, даже не нужно читать файл с флешки - я сразу выдрал PCM-данные из WAV-файла (файл был специально подготовлен: 8 kHz, 8-bit, mono) и подгружаю их в виде массива из заголовочного файла.

Вывод в ЦАП очередной порции информации происходит по прерываниям от таймера, работающего на частоте 8кГц (что соответствует частоте дискретизации файла). Однако при попытке вывести всё это на динамик, я получаю какие-то хрипы и сипение, что довольно далеко от того, что я хочу слышать.

void Audio_TIM_Init(void) {
  TIM_ClockConfigTypeDef sClockSourceConfig;
  TIM_MasterConfigTypeDef sMasterConfig;

  __HAL_RCC_TIM3_CLK_ENABLE();

  htim.Instance = TIM3;
  htim.Init.Prescaler = (uint16_t) (SystemCoreClock / 1000000) - 1;
  htim.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim.Init.Period = 125;
  htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  HAL_TIM_Base_Init(&htim);

  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  HAL_TIM_ConfigClockSource(&htim, &sClockSourceConfig);

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
 HAL_TIMEx_MasterConfigSynchronization(&htim, &sMasterConfig);

  HAL_NVIC_SetPriority(TIM3_IRQn, 0, 1);
  HAL_NVIC_EnableIRQ(TIM3_IRQn);
  HAL_TIM_Base_Start_IT(&htim);
}


Путём экспериментов я добился нужного звука (хотя и с жуткими помехами) на частоте прерываний в 32 кГц. И теперь я пытаюсь понять, в чём причина такого поведения микроконтроллера и чем мне руководствоваться при настройке прерываний?

UPD: Вопрос решён осциллографом и вдумчивым изучением схемы тактирования STM32. Как оказалось, я задал не тот делитель во время инциализации системной шины и потому таймер тактировался как раз в 4 раза медленнее, чем я рассчитывал.
  • Вопрос задан
  • 775 просмотров
Решения вопроса 1
gbg
@gbg
Любые ответы на любые вопросы
Подключите ваш ЦАП к осциллографу (хватит и звуковой платы) и посмотрите на сигнал.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@evgeniy_lm
на выходе ЦАП должен стоять НЧ фильтр.
Ответ написан
tolikvoron
@tolikvoron
Не пью, не курю... Почти.
Вспомните теорему Котельникова.... Частота опроса должна быть не менее чем в два раза выше частоты опрашиваемого сигнала. Ну и, конечно, фильтрация... Т. е. частота выше 30-40 КГц... Чем чаще, тем лучше....
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы