Thread 中讨论的其他器件:controlSUITE
工具/软件:Code Composer Studio
您好!
我想通过改变 ADC 的输入来改变正弦的振幅。我在配置 ADC 时遇到了问题。 当我向 ADCINA4 引脚提供3.3伏电压时,我得到了错误的值。我正在使用闪存 file.please 运行代码如果有人知道解决方案,请帮助我。
//######################################################################################################################
//
//:Example_2802xAd
//
//标题:F2802x ADC 转换开始(SOC)示例程序。
//
//假设:
//
//此程序需要 F2802x 头文件。
//
//确保在中正确定义了 CPU 时钟速度
// f2802x_Examples.h 再编译此示例。
//
//连接要转换为 A2和 A3的信号。
//
//根据提供的信息,此项目配置为“引导至 SARAM”
//操作。 2802x 引导模式表如下所示。
//有关配置 eZdsp 引导模式的信息,
//请参阅 eZdsp 附带的文档,
//
//$Boot_Table
//当仿真器连接到您的器件时、TRSTn 引脚= 1、
//将器件设置为 EMU_boot 引导模式。 在此模式下
//外设启动模式如下:
//
//引导模式:EMU_KEY EMU_BMODE
//(0xD00)(0xD01)
//--------------------------------------------------------
//等待!=0x55AA X
// I/O 0x55AA 0x0000
// SCI 0x55AA 0x0001
//等待0x55AA 0x0002
// get_Mode 0x55AA 0x0003
// SPI 0x55AA 0x0004
// I2C 0x55AA 0x0005
// OTP 0x55AA 0x0006
//等待0x55AA 0x0007
//等待0x55AA 0x0008
// SARAM 0x55AA 0x000A <--“Boot to SARAM”(引导至 SARAM)
//闪存0x55AA 0x000B
//等待0x55AA Other
//
//通过调试器将 EMU_KEY 写入0xD00、将 EMU_BMODE 写入0xD01
//根据上面的引导模式表。 编译/加载工程、
//重置设备,然后运行示例
//
//$end_Boot_Table
//
//
//描述:
//
//此示例将 PLL 设置为 x12/2模式。
//
//对于60MHz 器件(默认)
//(假设输入时钟为10MHz)。
//
//中断被启用并且 ePWM1被设置为生成一个周期
// ADC SOC - ADCINT1。 两个通道被转换、ADCINA4和 ADCINA2。
//
//监视变量:
//
// Voltage1[10]最后10个 ADCRESULT0值
// Voltage2[10]最后10个 ADCRESULT1值
//转换计数当前结果编号0-9
// LoopCount 空闲循环计数器
//
//
//######################################################################################################################
//$TI 发行版:F2802x 支持库 v230美元
//$Release Date:5月8日星期五07:43:05 CDT 2015 $
//版权所有:版权所有(C) 2008-2015 Texas Instruments Incorporated -
// http://www.ti.com/ 保留所有权利$
//######################################################################################################################
#include "DSP28x_Project.h"//器件头文件和示例 include 文件
#include "math.h"
#include"GPIO.h"
void InitEPwm1Examples(void);
//此文件中找到的函数的原型语句。
_interrupt void epwm1_ISR (void);
_interrupt void epwm2_ISR (void);
_interrupt void epwm3_ISR (void);
_interrupt void ADC_ISR (void);
void ADC_Config (void);
//此示例中使用的全局变量:
unsigned int r、y、b;
uint16_t LoopCount;
uint16_t K1;
uint16_t K2;
uint16_t K3;
float ipcb1[300];
float ipcb2[300];
float ipcb3[300];
#define PRD 4000
#define PI 3.14159265358979323846
extern uint16_t RamfuncsLoadStart;
extern uint16_t RamfuncsLoadSize;
extern uint16_t RamfuncsRunStart;
float main (空)
{
//警告:始终确保在从 RAM 运行任何函数之前调用 memcpy
// InitSysCtrl 包括对基于 RAM 的函数的调用,而不调用
// memcpy 首先,处理器将进入“杂草”
#ifdef _flash
memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize);
#endif
//步骤1. 初始化系统控制:
// PLL、安全装置、启用外设时钟
//此示例函数位于 F2802x_sysctrl.c 文件中。
InitSysCtrl();
//步骤2. 初始化 GPIO:
//此示例函数位于 F2802x_GPIO.c 文件和中
//说明了如何将 GPIO 设置为其默认状态。
// InitGpio();//针对此示例跳过
InitEPwm1Gpio();
InitEPwm2Gpio();
InitEPwm3Gpio();
//步骤3. 清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
Dint;
//将 PIE 控制寄存器初始化为默认状态。
//默认状态为禁用所有 PIE 中断和标志
//被清除。
//此函数位于 F2802x_PIECTRL.c 文件中。
InitPieCtrl();
//禁用 CPU 中断并清除所有 CPU 中断标志:
IER = 0x0000;
IFR = 0x0000;
//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//这将填充整个表,即使是中断也是如此
//在本例中未使用。 这对于调试很有用。
//可以在 F2802x_DefaultIsr.c 中找到 shell ISR 例程
//此函数可在 F2802x_PieVect.c 中找到
InitPieVectTable();
//此示例中使用的中断被重新映射到
//此文件中的 ISR 函数。
EALLOW;//这是写入 EALLOW 受保护寄存器所必需的
PieVectTable.ADCINT1 =&ADC_ISR;
PieVectTable.EPWM1_INT =&epwm1_ISR;
PieVectTable.EPWM2_INT =&epwm2_ISR;
PieVectTable.EPWM3_INT =&epwm3/ISR;
EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需的
memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize);
//步骤4. 初始化所有器件外设:
InitAdc ();//对于此示例,初始化 ADC
AdcOffsetSelfCal();
//步骤5. 特定于用户的代码、启用中断:
//在 PIE 中启用 ADCINT1
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=0;
EDIS;
InitEPwm1Examples();
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=1;
EDIS;
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
PieCtrlRegs.PIEIER3.bit.INTx2 = 1;
PieCtrlRegs.PIEIER3.bit.INTx3=1;
PieCtrlRegs.PIEIER1.bit.INTx1 = 1;//在 PIE 中启用 INT 1.1
IER |= M_INT1;//启用 CPU 中断1
IER |= M_INT3;
EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM
LoopCount = 0;
//配置 ADC
//注意:通道 ADCINA4将被双采样以解决修订版0器件勘误表中的 ADC 第一个采样问题
EALLOW;
AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1;//ADCINT1在 AdcResults 锁存后跳闸
AdcRegs.INTSEL1N2.bit.INT1E = 1;//启用 ADCINT1
AdcRegs.INTSEL1N2.bit.INT1CONT = 0;//禁用 ADCINT1连续模式
AdcRegs.INTSEL1N2.bit.INT1SEL = 2;//设置 EOC2以触发 ADCINT1触发
AdcRegs.ADCSOC1CTL.bit.CHSEL = 4;//将 SOC0通道选择设置为 ADCINA4
AdcRegs.ADCSOC2CTL.bit.CHSEL = 4;//将 SOC1通道选择设置为 ADCINA4
AdcRegs.ADCSOC3CTL.bit.CHSEL = 2;//将 SOC1通道选择设置为 ADCINA2
AdcRegs.ADCSOC1CTL.bit.TRIGSEL = 0xB;//设置 SOC0在 EPWM1A 上启动触发器、因为轮询 SOC0先转换、然后 SOC1
AdcRegs.ADCSOC2CTL.bit.TRIGSEL = 0xB;//设置 EPWM1A 上的 SOC1启动触发器,因为轮询 SOC0先转换,然后 SOC1
AdcRegs.ADCSOC3CTL.bit.TRIGSEL = 0xB;//设置 EPWM1A 上的 SOC2启动触发器、因为轮询 SOC0先转换 SOC1、然后转换 SOC2
AdcRegs.ADCSOC1CTL.bit.ACQPS = 6;//将 SOC0 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)
AdcRegs.ADCSOC2CTL.bit.ACQPS = 6;//将 SOC1 S/H 窗口设置为7个 ADC 时钟周期、(6个 ACQPS 加1)
AdcRegs.ADCSOC3CTL.bit.ACQPS = 6;//将 SOC2 S/H 窗口设置为7个 ADC 时钟周期、(6个 ACQPS 加1)
EDIS;
//假设 ePWM1时钟已在 InitSysCtrl()中启用;
EPwm4Regs.ETSEL.bit.SOCAEN = 1;//启用组上的 SOC
EPwm4Regs.ETSEL.bit.SOCASEL = 4;//从 CPMA 中选择 SOC,启用计数
EPwm4Regs.ETPS.bit.SOCAPRD = 1;//在发生第一个事件时生成脉冲
EPwm4Regs.CMPA.half.CMPA = 0x0080;//设置比较值
EPwm4Regs.TBPRD = 0xFFFF;//为 ePWM1设置周期
EPwm4Regs.TBCTL.bit.CTRMODE = 0;//向上计数并启动
//等待 ADC 中断
for (;;)
{
LoopCount++;
}
}
_interrupt void ADC_ISR (void)
{
K1 = AdcResult.ADCRESULT1;//将 ADCRESULT0作为修订版0第一个样本勘误表权变措施的一部分丢弃
K2 = AdcResult.ADCRESULT2;
K3 = AdcResult.ADCRESULT3;
AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 ADCINT1标志为下一个 SOC 重新初始化
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;//确认 PIE 中断
返回;
}
_interrupt void epwm1_ISR (void)
{
对于(r=0;r<300;r++)
{
ipcb1[r]=k1*sin (2*0.00333*pi*r);
EPwm1Regs.CMPA.half.CMPA = ipcb1[r];
if (((EPwm1Regs.TBCTR-(PRD/2))*2>(ipcb1[r])//设置操作
{
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;
EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;
EPwm1Regs.AQCTLB.bit.CAU = AQ_CLEAR;
EPwm1Regs.AQCTLB.bit.CAD = AQ_SET;
}
其他
{
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;
EPwm1Regs.AQCTLB.bit.CAU = AQ_SET;
EPwm1Regs.AQCTLB.bit.CAD = AQ_CLEAR;
}
如果(r=301){
R=0;
}
}
//清除此计时器的 INT 标志
EPwm1Regs.ETCLR.bit.INT = 1;
//确认此中断以接收来自组3的更多中断
PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;
}
_interrupt void epwm2_ISR (void)
{
for (y=0;y<300;y++)
{
ipcb2[y]=k2*sin ((2*0.00333*pi*y)+2.09439);
EPwm2Regs.CMPA.half.CMPA = ipcb2[y];
//设置操作
if (((EPwm2Regs.TBCTR-(PRD/2))*2>(ipcb2[y]))
{
EPwm2Regs.AQCTLA.bit.CAU = AQ_SET;//在 CAU 上设置 PWM2A
EPwm2Regs.AQCTLA.bit.CAD = AQ_CLEAR;//清除 CAD 上的 PWM2A
EPwm2Regs.AQCTLB.bit.CAU = AQ_CLEAR;
EPwm2Regs.AQCTLB.bit.CAD = AQ_SET;
}
其他
{
EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm2Regs.AQCTLA.bit.CAD = AQ_SET;
EPwm2Regs.AQCTLB.bit.CAU = AQ_SET;
EPwm2Regs.AQCTLB.bit.CAD = AQ_CLEAR;
}
如果(y==301){
Y=0;
}
}
//清除此计时器的 INT 标志
EPwm2Regs.ETCLR.bit.INT = 1;
//确认此中断以接收来自组3的更多中断
PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;
}
_interrupt void epwm3_ISR (void)
{
for (b=0;b<300;b++)
{
ipcb3[b]=K3*sin ((2*pi*0.00333*b)-2.09439);
EPwm3Regs.CMPA.half.CMPA = ipcb3[b];
if (((EPwm3Regs.TBCTR-(PRD/2))*2>(ipcb3[b])//设置操作
{
EPwm3Regs.AQCTLA.bit.CAU = AQ_SET;
EPwm3Regs.AQCTLA.bit.CAD = AQ_CLEAR;
EPwm3Regs.AQCTLB.bit.CAU = AQ_CLEAR;
EPwm3Regs.AQCTLB.bit.CAD = AQ_SET;
}
其他
{
EPwm3Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm3Regs.AQCTLA.bit.CAD = AQ_SET;
EPwm3Regs.AQCTLB.bit.CAU = AQ_SET;
EPwm3Regs.AQCTLB.bit.CAD = AQ_CLEAR;
}
如果(b==301){
B=0;
}
//清除此计时器的 INT 标志
EPwm3Regs.ETCLR.bit.INT = 1;
//确认此中断以接收来自组3的更多中断
PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;
}
}
空 InitEPwm1示例(空)
{
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;// GPIO ³õʼ»¯ÎªepwmÊä³ö
GpioCtrlRegs.GPAMUX1.bit.GPIO1=1;
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1;
GpioCtrlRegs.GPAMUX1.bit.GPIO3=1;
GpioCtrlRegs.GPAMUX1.bit.GPIO4=1;
GpioCtrlRegs.GPAMUX1.bit.GPIO5=1;
EDIS;
EPwm1Regs.TBPRD = PRD;//设置定时器周期
EPwm1Regs.TBPHS.Half.TBPHS = 0x0000;//相位为0
EPwm1Regs.TBCTR = 0x0000;//清除计数器
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//向上计数
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相位加载
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT 的比率
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADODE;//每0加载一次寄存器
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
//低电平有效 PWM -设置死区
EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FUL_ENABLE;
EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
EPwm1Regs.DBCTL.bit.IN_MODE = DBA_ALL;
EPwm1Regs.DBRED = 270;
EPwm1Regs.DBFED = 270;
//中断,我们将在其中更改死区
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;//选择零事件时的 INT
EPwm1Regs.ETSEL.bit.INTEN = 1;//启用 INT
EPwm1Regs.ETPS.bit.INTPRD = et_1st;//在第三个事件发生时生成 INT
EPwm2Regs.TBPRD = PRD;//设置定时器周期
EPwm2Regs.TBPHS.Half.TBPHS = 0x0535;//相位为0
EPwm2Regs.TBCTR = 0x0000;//清除计数器
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//向上计数
EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE;//禁用相位加载
EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT 的比率
EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;//慢、只在示波器上观察
//低电平有效互补 PWM -设置死区
EPwm2Regs.DBCTL.bit.OUT_MODE = DB_FUL_ENABLE;
EPwm2Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
EPwm2Regs.DBCTL.bit.IN_MODE = DBA_ALL;
EPwm2Regs.DBRED = 270;
EPwm2Regs.DBFED = 270;
//中断,我们将在其中修改死区
EPwm2Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;//选择零事件时的 INT
EPwm2Regs.ETSEL.bit.INTEN = 1;//启用 INT
EPwm2Regs.ETPS.bit.INTPRD = et_1st;//在第三个事件发生时生成 INT
EPwm3Regs.TBPRD = PRD;//设置定时器周期
EPwm3Regs.TBPHS.Half.TBPHS = 0xA6A;//相位为0
EPwm3Regs.TBCTR = 0x0000;//清除计数器
EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//向上计数
EPwm3Regs.TBCTL.bit.PHSEN = TB_ENABLE;//禁用相位加载
EPwm3Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT 的比率
EPwm3Regs.TBCTL.bit.CLKDIV = TB_DIV1;//速度慢、我们可以在示波器上观察
//高电平有效互补 PWM -设置死区
EPwm3Regs.DBCTL.bit.OUT_MODE = DB_FUL_ENABLE;
EPwm3Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
EPwm3Regs.DBCTL.bit.IN_MODE = DBA_ALL;
EPwm3Regs.DBRED = 270;
EPwm3Regs.DBFED = 270;
//中断,我们将在其中更改死区
EPwm3Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;//选择零事件时的 INT
EPwm3Regs.ETSEL.bit.INTEN = 1;//启用 INT
EPwm3Regs.ETPS.bit.INTPRD = et_1st;//在第三个事件发生时生成 INT
}








