C2000 ADC和DAC实验
C2000 ADC和DAC的实验
本实验的目标是熟悉片上模数转换器 (ADC) 模块。微控制器 (MCU) 将设置为以规定的采样率对单个 ADC 输入通道进行采样,并将转换结果存储在循环存储器缓冲区中。 在本实验的第二部分中,将探索数模转换器 (DAC)。本实验旨在去更深入地了解 ADC 和 DAC 模块的功能,以及模拟子系统与其他模块的常见交互方式。
概述
在本实验中,将设置一个 ePWM 模块来触发 ADC 的转换开始 (SOC) 信号。然后,ADC 将以所需的采样率开始对其输入进行采样。ADC 将使用转换结束 (EOC) 中断来提示 CPU 将 ADC 转换结果复制到内存中的结果缓冲区中。该缓冲区指针将以循环方式管理,以便新的转换结果不断覆盖缓冲区中最旧的转换结果。为了生成所需的输入信号,代码还将在 ADC 中断服务程序 (ISR) 中切换 GPIO 的高低电平。该 GPIO 引脚将连接到 ADC 作为待采样的输入。在本实验的另一个可选部分中,可以使用数模转换器 (DAC) 生成正弦波,然后由 ADC 进行采样。
硬件配置
C2000™LAUNCHXL-F28379DLaunchPad™是一款完整的低成本开发板,LAUNCHXL-F28379D包含开发基于 F2837xD 微控制器的应用程序所需的所有硬件和软件。
启动CCS项目
首先,将一个空项目从 C2000Ware 导入到 CCS 工作区:
- 打开 CCS,然后依次选择“File”→“Import Projects”。
- 点击“Browse”按钮,找到[C20000ware]/driverlib\f2837xd\examples\cpu1\empty_projects
目录。 - 在“discovered projects”下,现在可以看到empty_projects。
- 点击“Finish”将 empty_projects] 项目导入并复制到您的 CCS 工作区。
- 项目导入后,将项目重命名为想要的名称, 项目资源管理器窗口应如下所示:
配置GPIO
下面将从配置三个必需的 GPIO 开始本次 ADC 实验:
- GPIO 22 将始终保持高电平
- GPIO 67 将在高电平和低电平之间切换
- 配置 LED 指示灯的GPIO。
首先,将 GPIO22 配置为持续拉高的输出,并用作 ADC 的输入之一。
双击项目中的 .syscfg 文件将其打开,然后配置正确的开发板:
接下来,可以添加第二个 GPIO (GPIO67)。GPIO67 将在应用程序中切换,以便用作 ADC 的另一个输入。按照设置 GPIO67的相同步骤操作,但将其命名为“myGPIOToggle”。
最后,添加一个 LED GPIO。此 LED 将在 ISR 中切换,以表明代码正在正确执行。在 SysConfig 中,选择“Hardware”选项卡。选择添加LED4。名称将在 ADC ISR 中引用,因此请确保名称为“myBoardLED0_GPIO”。
配置ePWM
EPWM 模块将用于自动触发 ADC SOC。所需的 EPWM 频率为 50kHz。首先在 Sysconfig 中添加一个 PWM 实例,方法是点击 Sysconfig 左侧窗格中“EPWM”旁边的 (+) 符号。
如果已经添加了一个 EPWM 实例,将按如下方式配置 EPWM‘时间基’子模块。
其次,我们将通过“事件触发器”子模块启用 ADC SOC 触发,如下所示:
选择了触发时时基计数器等于周期。当主时钟为200M,但EPWM最大频率为100M, 如果EPWM 频率为 50kHz,则应设置时钟基准周期位1999(100M/50K-1)。这样ADC的采样率也就是50KHz。
配置ADC
要设置 ADC,需要在 SysConfig 中添加一个 ADC 实例。请按以下方式设置 ADC:
ADCCLK最大为50M。
现在将配置 ADC SOC(转换开始)。SOC0 的触发器是 epwm1
接下来,需要设置 ADC 中断。在这种情况下,ADCINT1 将在转换结束时 (EOC) 产生中断。这样做是为了确保从 ISR 中读取 ADC 结果时,ADC 转换结果已经准备好。
最后,我们需要设置 ADC 中断。具体操作是启用 ADC 中断并配置 ADC 中断处理程序名称。
以上配置,便可以在LAUNCHXL-F28379D的外接端口上找到对应的接口:
程序设置
设置 ADC ISR
现在已经在 SysConfig 中配置了 ADC 和 PWM 模块,接下来可以切换到本实验的应用程序代码部分。在项目中,点击main .c 文件。在 mian.c 文件中,需要编写每次发生 ADC 中断时执行的代码,也称为 ISR(中断服务程序)。本项目需要定义 ADCBufPtr(用于将 ADC 结果放入缓冲区的变量)。以下代码用于声明 ISR 中的变量以及将用于更改 LED 状态的变量。将以下代码复制到源main .c 文件中。注意:ISR 函数的名称是我们之前在 ADC 的 SysConfig 配置中定义的。
interrupt void INT_myADC0_1_ISR(void)
{
static uint16_t *AdcBufPtr = AdcBuf;
static volatile uint16_t LED_count = 0;
下一段代码是 ISR 的另一部分,用于将 ADC 结果存储在缓冲区中。我们还需要处理缓冲区已满的情况。一种方法是覆盖先前的值。将以下代码添加到您的 ISR 中。
// Read the ADC Result
*AdcBufPtr++ = ADC_readResult(myADC0_RESULT_BASE, myADC0_SOC0);
// Brute Force the circular buffer
if (AdcBufPtr == (AdcBuf + ADC_BUF_LEN))
{
AdcBufPtr = AdcBuf;
}
下一步是切换 GPIO,以便将其用作 ADC 输入。将以下代码添加到您的 ISR 中。
// Toggle the pin
if(DEBUG_TOGGLE == 1)
{
GPIO_togglePin(myGPIOToggle);
}
现在我们可以选择切换设备上的 LED 了。这说明程序运行正常,并且确实进入了中断服务程序 (ISR)。
请注意,每当 LED_count > 25000 时,我们都会切换 LED。这相当于每次切换约 0.5 秒。
将以下代码添加到您的 ISR 中:
if(LED_count++ > 25000) // Toggle slowly to see the LED blink
{
GPIO_togglePin(myBoardLED0_GPIO); // Toggle the pin
LED_count = 0; // Reset the counter
}
最后,在 ISR 中,我们必须确认 PIE 组并清除中断状态标志,以便将来能够继续处理中断。将以下代码添加到您的 ISR 中。<