This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28335:TMS320F28335中的模拟信号读数

Guru**** 2551570 points
Other Parts Discussed in Thread: TMS320F28335

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1218148/tms320f28335-analog-signal-reading-in-tms320f28335

器件型号:TMS320F28335

大家好、我正在研究一个正弦信号的频率估算、平均频率为50Hz。 我将使用 ADC 读取信号。 我只有一个来自 ADC 的信号。 我的项目将在500Hz 采样频率下进行相同的计算。 为此、我创建了一个频率为500Hz 的 EPWM 中断。 如何配置 ADC 以获得采样窗口和时钟设置? 我在下面分享了代码。 在中断文件中、我用我拥有的估计信号对我的模拟信号进行减去。 谢谢你已经。

//
// Lab8_1:TMS320F28335
//(c) Frank Bormann
//
//################################################################出##############################
//
//文件:lab8_1.c
//
//标题:DSP28335ControlCARD 模拟输入
// ADCIN_A0,ADCIN_A1连接到可变电阻 VR1,VR2
//外设学习板(3.3V...0V)
//以50kHz 的频率进行 ADC 采样,硬件由 ePWM2触发
//电压交替显示在4个 LED LD1...LD4上
//(GPIO9、GPIO11、GPIO34和 GPIO49)
// CPU Timer0 ISR 每100ms 一次
//看门狗处于活动状态,在 ISR 和主循环中清除
//
//################################################################出##############################
// Ver | dd mmm yyyy |谁|更改说明
//=== =================== |========= ===================================================
// 3.0 | 2009年6月30日| F.B.|用于 F28335CC + peripheral Explorer 的 Lab8_1
// 3.1 | 2009年11月9日| F.B | Lab8_1为 F28335和 PE 修订版5
//################################################################出##############################
#include "DSP2833x_Device.h"
#include "math.h"
#include "match_func.h"

//外部函数原型
外部 void InitAdc (void);
extern void InitSysCtrl (void);
extern void InitPieCtrl (void);
extern void InitPieVectTable (void);
extern void InitCpuTimers (void);
extern void ConfigCpuTimer (结构 CPUTIME_VARS *、float、float);
extern void display_adc (unsigned int);

//针对此文件中的函数的 prototype 语句。
void GPIO_select (void);
中断失效 CPU_timer0_ISR (void);
Interrupt void ADC_ISR (void);// ADC 序列结束 ISR

//全局变量
unsigned int Voltage_VR1[2];
unsigned int Voltage_VR2[2];
unsigned int Sin_Ref[2]={0、0、0};

/*这里我们需要一个参数矩阵,包括带3*3矩阵的直流交流和相变量
*此参数矩阵将使用值0进行初始化,在主循环中,我们将修改我们的值。
*
*/
//################################################################出##############################
//主代码
//################################################################出##############################
空 main (void)

InitSysCtrl ();//从 DSP2833x_sysctrl.c 中启动基本内核

EALLOW;
SysCtrlRegs.WDCR= 0x00AF;//重新启用看门狗
EDIS;// 0x00AF 以不禁用看门狗,预分频器= 64

dint;//禁用所有中断

GPIO_select ();// GPIO9、GPIO11、GPIO34和 GPIO49作为输出
//外设 Explorer 中的4个 LED)

InitPieCtrl ();// PIE 表的基本设置;来自 DSP2833x_PIECTRL.c

InitPieVectTable();// PIE 中的默认 ISR

InitAdc ();//基本 ADC 设置,包括 校准

AdcRegs.ADCTRL1.all = 0;
AdcRegs.ADCTRL1.bit.ACQ_PS = 7;// 7 = 8 x ADCCLK
AdcRegs.ADCTRL1.bit.SEQ_CASC =1;// 1=级联序列发生器
AdcRegs.ADCTRL1.bit.cps = 0;//除以1
AdcRegs.ADCTRL1.bit.CONT_RUN = 0;//单运行模式

AdcRegs.ADCTRL2.ALL = 0;
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;// 1=启用 SEQ1中断
AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 =1;// 1=SEQ1从 EPWM_SOCA 触发开始
AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1 = 0;// 0 =序列每次结束后中断

AdcRegs.ADCTRL3.bit.ADCCLKPS = 3;// ADC 时钟:FCLK = HSPCLK /2 * ADCCLKPS
// HSPCLK = 75MHz (请参见 DSP2833x_SYSCTRL.c)
// FCLK = 12.5MHz

AdcRegs.ADCMAXCONV.all = 0x0000;//序列发生器1的2次转换

AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0;//将 ADCINA0设置为第一个 SEQ1转换
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 1;//将 ADCINA1设置为第二个 SEQ1转换

EPwm2Regs.TBCTL.all = 0xD030;//配置计时器控制寄存器
/*
位15-14 11:自由/软、11 =忽略仿真挂起
位13 0:PHSDIR、0 =同步事件后倒计数
位12-10 100:CLKDIV、100 => TBCLK = HSPCLK/1 ===16
位9-7 000:HSPCLKDIV、101 =10=>HSPCLK = SYSCLKOUT/1
位6 0:SWFSYNC、0 =不产生软件同步
位5-4 11:SYNCOSEL、11 =禁用同步输出
位3 0:PRDLD、0 =计数器= 0时重新加载 PRD
位2 0:PHSEN、0 =相位控制被禁用
位1-0 00:CTRMODE、00 =递增模式
*/

EPwm2Regs.TBPRD = 1875;// TPPRD +1 = TPWM /(HSPCLKDIV (10)* CLKDIV (16)* TSYSCLK)
µs = 2000 μ s/1、066.72ns

EPwm2Regs.ETPS.all = 0x0100;//通过 ePWM2配置 ADC 启动
/*
位15-14 00:EPWMxSOCB、只读
位13-12 00:SOCBPRD、无关
位11-10 00:EPWMxSOCA、只读
00:位9-8 01:SOCAPRD、01 =在第一个事件上生成 SOCA
位7-4 0000:保留
位3-2 00:INTCNT、无关
位1-0 00:INTPRD、无关
*/

EPwm2Regs.ETSEL.ALL = 0x0A00;//启用 SOCA 至 ADC
/*
位15 0:SOCBEN、0 =禁用 SOCB
位14-12 000:SOCBSEL、无关
位11 1:SOCAEN、1 =启用 SOCA
位10-8 010:SOCASEL、010 = PRD 事件上的 SOCA
位7-4 0000:保留
位3 0:INTEN、0 =禁用中断
位2-0 000:INTSEL、无关
*/

EALLOW;

PieVectTable.ADCINT =&ADC_ISR;
EDIS;

InitCpuTimers ();//基本设置 CPU Timer0、1和2


PieCtrlRegs.PIEIER1.bit.INTx6 = 1;// adc.

IER |=1;

EINT;
ERTM;

CpuTimer0Regs.tcr.bit.tss = 0;//开始 timer0
unsigned int sample_counter=0;
while (1)


}


中断失效 ADC_ISR (void)

//

if (sample_counter==fs){//////// 这是为了不走过去
//////////////////////////////////////////// 32位变量的最高有效位限制
SAMPLE_COUNTER=0;
}
//////////////////////////// 模拟信号//////////////////////////////////////////////////
VOLTAGE_VR1[2]= Voltage_VR1[1];
VOLTAGE_VR1[1]= Voltage_VR1[0];//将最后一个模拟电压移入索引1
VOLTAGE_VR1[0]= AdcMirror.ADCRESULT0;//将结果存储在3x1矩阵中

//针对下一个 ADC 序列重新初始化
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;//复位 SEQ1
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;//清除 INT SEQ1位
PieCtrlRegs.PIEACK.all = PIEACK_Group1;//确认 PIE 的中断

////////////////////////////////////////////////////////////////// 基准信号刷新////////////////////////////////////////
Sin_Ref[2]= Sin_Ref[1];
Sin_Ref[1]= Sin_Ref[0];
sin_Ref[0]= parameter_vector[1]*sin (((2*3.14*50*sample_counter)/fs)+ parameter_vector[1][2]);
////////////////////////////////////////////////////////// 错误矩阵刷新//////////////////////////
ERROR[0]= Sin_Ref[0]-Voltage_VR1[0];
ERROR[1]= Sin_Ref[1]-Voltage_VR1[1];
ERROR[2]= Sin_Ref[2]- Voltage_VR1[2];
//////////////////////////////////////////////////////////// Jacobian 矩阵//////////////////////////////

Jacob [1][1]=sin (((2*3.14*50*SAMPLE_COUNTER)/fs)+ parameter_vector[1][2]);
Jacob [1][2]= parameter_vector[1]*sin (((2*3.14*50*sample_counter)/fs)+ parameter_vector[1][2]);
Jacob [1][3]=1;
Jacob [2][1]=sin ((((2*3.14*50*SAMPLE_COUNTER)/fs)+ parameter_vector[2]);
Jacob [2][2]= parameter_vector[2][1]* sin ((((2*3.14*50*sample_counter)/fs)+ parameter_vector[2][2]);
Jacob [2][3]=1;
Jacob [3][1]=sin (((2×3.14*50*采样计数器)/fs)+ parameter_vector[3][2]);
Jacob [3][2]= parameter_vector[3][1]* sin ((((2*3.14*50*SAMPLE_COUNTER)/fs)+ parameter_vector[3][2]);
Jacob [3][3]=1;
////////////////////////////////////////////////////////////////////////////
转置(t_jacob、jacob、3);//// (j^t)
multiple (t_jacob、jacob、3、mul);//// (j^t*j)
inverter (mul、inv、3);////// (j^t*j)'
multiple (inv、t_jacob、3、j_t_j_tjacob);//// (j^t*j)'j^t
multiple (j_t_jacob、error、3、m_delta);//// (j^t*j)'j^t*ek
负数(delta、m_delta、3);///这是基本参数向量
add_matrix (参数向量、增量、参数向量、3);///参数向量刷新
////////////////////////////////////////////////////////////////////////////

采样_计数器++;

AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;//复位 SEQ1
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;//清除 INT SEQ1位
PieCtrlRegs.PIEACK.all = PIEACK_Group1;//确认 PIE 的中断
}

//===================================================================
//源码结束。
//===================================================================

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Yigit,

    在 ADC 时钟和 AQPS 控制 ADC 的速度和采样持续时间时、ePWM 触发器控制采样率。  由于您已经在 PWM 频率上更改为新周期、这就是您所要做的。  

    您可能想要更改 ACQPS 的唯一原因是、ADC 输入引脚的源阻抗已更改、并且您需要提供更长的持续时间来为内部采样保持电容器充电。

    此致!

    Matthew