Часть I. Формирование сигналов звуковой частоты

 при помощи прямоугольных импульсов

 

В работе необходимо сгенерировать звуковую гамму (звуковой ряд) используя динамик, соединенный с выходом T1PWM. В первой части лабораторной работы звучание организуется при помощи прямоугольных импульсов, генерируемых таймером Менеджера Событий. Каждая нота будет воспроизводиться 500 мс. Загрузка новой ноты будет производиться по прерыванию таймера ЦПУ 0. Период таймера ЦПУ – 50 мс. В подпрограмме обслуживания прерываний от ЦПУ таймера 0 необходимо производить сброс Watchdog и загружать новую ноту. Обратите внимание на период между прерываниями таймера, периодом Watchdog и периодом перезагрузки новой ноты.

 

Таблица. Соответствие частот музыкальным нотам

Нота С1 D E F G A H C2
Частота, Гц 264 297 330 352 396 440 495 528

 

1. Создание нового проекта.

В Code Composer Studio создаем новый проект Lab5.pjt. Открываем файл Lab4.c и сохраняем его E:\C281x\Labs\Lab5\lab5.c.

Добавляем в проект файлы:

 

C:\CCStudio_v3.3\C2000\cgtools\lib\rts2800_ml.lib

C:\tidcs\c28\dsp281x\v100\DSP281x_common\source\DSP281x_CpuTimers.c

C:\tidcs\c28\dsp281x\v100\DSP281x_common\source\DSP281x_DefaultIsr.c

C:\tidcs\c28\dsp281x\v100\DSP281x_common\source\DSP281x_PieCtrl.c

C:\tidcs\c28\dsp281x\v100\DSP281x_common\source\DSP281x_PieVect.c

C:\tidcs\c28\dsp281x\v100\DSP281x_headers\source\DSP281x_GlobalVariableDefs.c

C:\tidcs\c28\dsp281x\v100\DSP281x_common\cmd\F2812_EzDSP_RAM_lnk.cmd

C:\tidcs\c28\dsp281x\v100\DSP281x_headers\cmd\DSP281x_Headers_nonBIOS.cmd

 

2. Настройка параметров проекта, компоновка проекта и загрузка выходного файла.

Включаем в проект заголовочные файлы: Project → Build Options, в закладке Compiler выбираем Preprocessor и в поле Include Search Path (-i) вводим: C:\tidcs\C28\dsp281x\v100\DSP281x_headers\include;..\include

  Задаем глубину стека: Project → Build Options → Linker → Stack Size: 0x400.

Компонуем проект: Project → Build.

Загружаем выходной файл: File → Load Program → Debug\ lab5.out.

 

3. Преобразование файла Lab5.c.

Удаляем те части программы, которые не будут использоваться данной лабораторной работе: массив LED[8].

Переходим к подпрограмме «Gpio_select()». Настраиваем линию 6 порта GPIOA на вывод функции T1PWM (GPАMUX).

В подпрограмме «InitSystem» разрешаем работу Менеджера Событий А.

Внутри главной подпрограммы записываем:

CpuTimer0Regs.TCR.bit.TSS = 0.

Настраиваем таймер 1 Менеджера Событий на выработку модулированного сигнала PWM:

Бит «TCMPOE» устанавливаем в 1, задаем “активный низкий” уровень (GPTCONA);

В регистре T1CON устанавливаем: режим счета вверх (TMODE), делитель 128 (TPS), запрещаем работу таймера (TENABLE), выбираем внутреннюю синхронизацию (TCLKS), разрешаем сравнение (TECMPR);

Определяем значения регистра периода (T1PR) для разных частот и заносим их в массив int frequency [8] = {?,?,?,?,?,?,?,?}. Исходя из формулы T1_PWM_Freq = 150MHz / (HISPCP * TPS * T1PR) для первой ноты в регистр периода необходимо занести: T1PR = 150MГц / (2 * 128 * 264 Гц) = 2219, для второй ноты T1PR = 150MГц / (2 * 128 * 297 Гц) = 1973 и т.д.

Так как сторожевой таймер будет сбрасываться быстрее (каждые 200 мс), чем прозвучит следующая нота (через 500 мс), то задаем условия:

if ((CpuTimer0.InterruptCount%4)= =0) SysCtrlRegs.WDKEY = 0xAA

 Разбиваем период воспроизведения нот на 10 периодов по 50 мс, для этого записываем условие: if ((CpuTimer0.InterruptCount – time_stamp) > 10).

После чего переменной «time_stamp» присваиваем текущее значение CpuTimer0.InterruptCount, загружаем код следующей ноты в T1PR, а в регистр T1CMPR заносим значение, равное T1PR/2. Разрешаем работу таймера.

 

4. Тестирование программы.

Сбрасываем ЦСП:    Debug → Reset CPU, Debug → Restart.

Переходим к главной подпрограмме: Debug → Go main.

Запускаем программу: Debug → Run.

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: