工具/软件:Code Composer Studio
我想使用TMS320F2.8335万开发套件来处理我的信号。 首先,我需要用ADC对模拟信号进行采样。
我尝试使用controlSUIT提供的ADC示例(ADC-SOC)。 代码工作正常,但采样频率非常慢。 我使用CCS中的图形工具查看采样信号。 当信号频率大于5Hz时,采样信号会失真。 即使我更改ePWM的PRD (EPwm1Regs.TBPRD = 0x012c;),采样频率仍没有更改。 为什么采样频率这么慢? 为什么我不能更改采样频率。 请任何人帮助我。 非常感谢。
代码如下所示:
#include "DSP28x_Project.h"//设备头文件和示例包括文件
//本文件中找到的函数的prototype语句。
__interrupt void ADC_ISR(void);
//此示例中使用的全局变量:
UINT16环计数;
UINT16转换计数;
UINT16第1[100]卷;
//UINT16第2[100]卷;
主要()
{
//步骤1. 初始化系统控制:
// PLL,看门狗,启用外设时钟
//此示例函数位于DSP2833x_sysctrl.c文件中。
InitSysCtrl();
EALLOW;
#IF (CPU_FRQ_150MHz)//默认值- 150 MHz SYSCLKOUT
#define ADC_MODCLK 0x3 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 150/(2*3)= 25.0 MHz
#endif
#IF (CPU_FRQ_100MHz)
#define ADC_MODCLK 0x2 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 100/(2*2)= 25.0 MHz
#endif
EDIS;
//定义ADCCLK时钟频率(小于或等于25 MHz)
//假定InitSysCtrl()已将SYSCLKOUT设置为150 MHz
EALLOW;
SysCtrlRegs.HISPPCP.ALL = ADC_MODCLK;
EDIS;
//步骤2. 初始化GPIO:
//此示例函数可在DSP2833x_GPIO.c文件和中找到
//说明了如何将GPIO设置为其默认状态。
// InitGpio();//跳过此示例
//步骤3. 清除所有中断并初始化PIE矢量表:
//禁用CPU中断
色调;
//将PIE控件寄存器初始化为其默认状态。
//默认状态是禁用所有PIE中断和标志
//被清除。
//此函数位于DSP2833x_PIECTRL.c文件中。
InitPieCtrl();
//禁用CPU中断并清除所有CPU中断标志:
IER = 0x0000;
IFR = 0x0000;
//使用指向外壳中断的指针初始化PIE矢量表
//服务例程(ISR)。
//这将填充整个表,即使中断也是如此
//在本例中不使用。 这对于调试非常有用。
// shell ISR例程可在DSP2833x_DefaultIsr.C.中找到
//此函数位于DSP2833x_PieVect.C.中
InitPieVectorTable();
//本示例中使用的中断被重新映射到
//此文件中找到ISR函数。
EALLOW;//这是写入EALLOW保护寄存器所必需的
PieVectorTable.ADCINT =&ADC_ISR;
EDIS;//这是禁用写入EALLOW保护寄存器所必需的
//步骤4. 初始化所有设备外围设备:
//此函数位于DSP2833x_InitPeripherals.c中
// InitPeripherals();//本示例不需要
InitAdc();//在此示例中,初始化ADC
//步骤5. 用户特定代码,启用中断:
//在PIE中启用ADCINT
PieCtrlRegs.PIEIER1.bit.INTx6=1;
IER || M_INT1;//启用CPU中断1
EINT;//启用全局中断INTM
ERTM;//启用全局实时中断DBGM
LoopCount = 0;
ConversionCount = 0;
// AdcRegs.ADCTRL1.bit.con_run = 0;
//配置ADC
AdcRegs.ADCMAXCONV.ALL = 0x0000;//在SEQ1上设置2个conv
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x3;//将ADCINA3设置为第一个SEQ1转换
// AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x2;//将ADCINA2设置为2nd SEQ1 Conv.
AdcRegs.ADCTRL2.bit.ePWM_SOCA_SEQ1 = 1;//从ePWM启用SOCA以启动SEQ1
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;//启用SEQ1中断(每个EOS)
//假定ePWM1时钟已在InitSysCtrl()中启用;
EPwm1Regs.ETSEL.bit.SOCAEN = 1;//在组上启用SOC
EPwm1Regs.ETSEL.bit.SOCASEL = 4;//在计数增加时从CPMA中选择SOC
EPwm1Regs.ETPS.bit.SOCAPRD = 1;//在第一个事件上生成脉冲
EPwm1Regs.CMPA.Half.CMPA = 0x0080;// set比较值
EPwm1Regs.TBPRD = 0xFFFF;//为ePWM1设置期间
EPwm1Regs.TBCTL.bit.CTRMODE = 0;//开始计数
//等待ADC中断
对于(;;)
{
LoopCount++;
}
}
__interrupt void ADC_ISR(void)
{
Voltage1[ConversionCount]= AdcRegs.ADCRESULT0 >>4;
// Voltage2[ConversionCount]= AdcRegs.ADCRESULT1 >>4;
//如果记录了40个转换,请重新开始
IF (ConversionCount == 99)
{
ConversionCount = 0;
}
否则
{
ConversionCount++;
}
//为下一个ADC序列重新初始化
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;//重置SEQ1
AdcRegs.ADCST.Bit.INT_SEQ1_CLR = 1;//清除INT SEQ1位
PIECtrlRegs.PIEACK/ALL = PIEACK_Group1;//确认中断到PIE
返回;
}