大家好、我正在研究一个正弦信号的频率估算、平均频率为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 的中断
}
//===================================================================
//源码结束。
//===================================================================