#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
#include <math.h>
#include "iic.h"
#include "oled.h"
#define POST_SHIFT 0 // Shift results after the entire sample table is full
#define INLINE_SHIFT 1 // Shift results as the data is taken from the results regsiter
#define NO_SHIFT 0 // Do not shift the results
#define pi 3.141593 // float小数点后6位
#define NL 512// NL为合成信号点数,与N的值必须是一致的,即NL=N
int N=NL; //FFT点数
#if (CPU_FRQ_150MHZ) // Default - 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
#define ADC_CKPS 0x00 // ADC module clock = HSPCLK/1 = 25.5MHz/(1) = 25.0 MHz
#define ADC_SHCLK 0x1 // S/H width in ADC module periods = 2 ADC cycle
#define AVG 1000 // Average sample limit
#define ZOFFSET 0x00 // Average Zero offset
#define BUF_SIZE 512// Sample buffer size
/**************************************函数声明************************************************/
void UARTa_SendString(char * msg);
void UARTa_SendByte(int a);
void UARTa_Init(Uint32 baud);
interrupt void cpu_timer0_isr(void);
void HC(float THD,float U1,float U2,float U3,float U4);
void display(float A);
void send5(float a);
void cout(int P);
/**********************************************************************************************/
Uint16 SampleTable[BUF_SIZE];
Uint16 fre[BUF_SIZE];
Uint16 doubleFF[BUF_SIZE];
Uint16 base_fre=0;
Uint16 j=0;
Uint16 k=0;
Uint16 sdata[17];
Uint16 rdata_SPI[17];
Uint16 rdata[17];
struct Complex // 定义复数结构体
{
float real,imag;
};
struct Complex Wn;//定义旋转因子
struct Complex Vn;//每一级第一个旋转因子虚部为0,实部为1
struct Complex T;//存放旋转因子与X(k+B)的乘积
float output[NL]={0};// 输出的FFT幅值(复数的模)
struct Complex Sample[NL];// 采样输入的实数转化为复数
struct Complex MUL(struct Complex a,struct Complex b)//定义复乘
{
struct Complex c;
c.real=a.real*b.real-a.imag*b.imag;
c.imag=a.real*b.imag+a.imag*b.real;
return(c);
}
void MYFFT(struct Complex *xin,int N)//输入为复数指针*xin,做N点FFT
{
int L=0; // 级间运算层
int J=0; // 级内运算层
int K=0,KB=0; // 蝶形运算层
int M=1,Nn=0;// N=2^M
float B=0; // 蝶形运算两输入数据间隔
/* 以下是为倒序新建的局部变量*/
int LH=0,J2=0,N1=0,I,K2=0;
struct Complex T;
/*以下是倒序*/
LH=N/2; // LH=N/2
J2=LH;
N1=N-2;
for(I=1;I<=N1;I++)
{
if(I<J2)
{
T=xin[I];
xin[I]=xin[J2];
xin[J2]=T;
}
K2=LH;
while(J2>=K2)
{
J2-=K2;
K2=K2/2;// K2=K2/2
}
J2+=K2;
}
/* 以下为计算出M */
Nn=N;
while(Nn!=2)// 计算出N的以2为底数的幂M
{
M++;
Nn=Nn/2;
}
/* 蝶形运算 */
for(L=1;L<=M;L++) // 级间
{
B=pow(2,(L-1));
Vn.real=1;
Vn.imag=0;
Wn.real=cos(pi/B);
Wn.imag=-sin(pi/B);
for(J=0;J<B;J++) // 级内
{
for(K=J;K<N;K+=2*B) // 蝶形因子运算
{
KB=K+B;
T=MUL(xin[KB],Vn);
xin[KB].real=xin[K].real-T.real;//原址运算,计算结果存放在原来的数组中
xin[KB].imag=xin[K].imag-T.imag;
xin[K].real=xin[K].real+T.real;
xin[K].imag=xin[K].imag+T.imag;
}
Vn=MUL(Wn,Vn);// 旋转因子做复乘相当于指数相加,得到的结果
}
}
}
/********************************
功能:计算复数的模
形参:*Sample指向需要取模的复数结构体
N为取模点数
*output存放取模后数值的数组
*********************************/
void ModelComplex(struct Complex *Sample,int N,float *output)
{
int i;
for(i=0;i<N;i++)
{
output[i]=sqrt(Sample[i].real*Sample[i].real+Sample[i].imag*Sample[i].imag)*2/N;
}
}
void FilterDC(struct Complex *ADC,int N)//去除数据中的直流成分,否则直流分量将很大
{
int i;
float sum=0;
for(i=0;i<N;i++)
{ sum+=ADC[i].real;}
sum=sum/N;
for(i=0;i<N;i++)
{
ADC[i].real-=sum;
}
}
/**************************************主程序************************************************/////////////
int flag=1;
int x=0;
float TIME11=19.5;
float frequen;
void main()
{
Uint16 i;
float U1,U2,U3,U4;
InitSysCtrl();
InitSciaGpio();
EALLOW;
SysCtrlRegs.HISPCP.all = ADC_MODCLK; // HSPCLK = SYSCLKOUT/ADC_MODCLK
EDIS;
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
InitFlash();
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.TINT0 = &cpu_timer0_isr;
EDIS; // This is needed to disable write to EALLOW protected registers
InitCpuTimers(); // For this example, only initialize the Cpu Timers
ConfigCpuTimer(&CpuTimer0,150,TIME11);
IER |= M_INT1; //CPU中断使能寄存器IER的第一位 置1,即使能中断INT1,开启CPU级的中断。
PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
EINT; //enable disrupt 使能中断
IICA_Init();
Oled_Init();
OLED_Clear();
UARTa_Init(9600);
InitAdc();
AdcRegs.ADCTRL1.bit.ACQ_PS = 0; // 采样时间选择位,SOC脉冲宽度
// = 1/(3*40ns) =8.3MHz (for 150 MHz SYSCLKOUT)
//= 1/(3*80ns) =4.17MHz (for 100 MHz SYSCLKOUT)
// If Simultaneous mode enabled: Sample rate = 1/[(3+ACQ_PS)*ADC clock in ns]
AdcRegs.ADCTRL1.bit.CPS=0; //预定标=1;f=CLK/1;
AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS; //ADC工作在25Mhz下,不再分频
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; // 级联排序器模式
AdcRegs.ADCTRL1.bit.CONT_RUN = 1; // 连续采样模式
AdcRegs.ADCTRL1.bit.SEQ_OVRD = 0; // 不使能排序覆盖
AdcRegs.ADCTRL3.bit.SMODE_SEL = 1; //设置同步采样模式
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; // 使能A0/B0通道进行采样,RESULT0
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x0; // 最大采集通道数为2对
AdcRegs.ADCTRL2.all = 0x2000;
//////////////////////////////////////////////////////
CpuTimer0Regs.TCR.bit.TSS=0;
///////////////////////////////////////////////////////
for (i=0; i<BUF_SIZE; i++)
{
SampleTable[i] = 0;
}
while(1)
{
// DALAY_US(300);
float THD=0;
if(flag)
{
CpuTimer0Regs.TCR.bit.TIE =1;
for(i=0;i<NL;i++)
{
while(AdcRegs.ADCST.bit.INT_SEQ1 == 0);
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;
Sample[i].real=(float)SampleTable[i];
Sample[i].imag=0;
}
flag=0;
//CpuTimer2Regs.TCR.bit.TIE =1;
FilterDC(Sample,512);
MYFFT(Sample,NL); //FFT
ModelComplex(Sample,NL,output); //求模
int w1=0,w2=0,w3=0,w4=0,w5=0;
int A=0,a11;
// for(a11=1;a11<512;a11++){
// if(output[a11+1]-output[a11]<5&&output[a11+1]-output[a11]>-5);
// else {while(1){if(output[a11+1]>output[a11])w1=++a11;else break;}break;}
// }
for(a11=1;a11<256;a11++){
if(output[a11]>output[A])A=a11;
}
w1=A;
A=0;
if(w1<35){
for(a11=w1+w1-w1/4;a11<w1+1.5*w1&&a11<512;a11++){
if(output[a11+1]-output[a11]<5&&output[a11+1]-output[a11]>-5);
else{while(1){if(output[a11+1]>output[a11])w2=++a11;else break;}break;}
// if(output[a11]>output[A])A=a11;
}
for(a11=2*w1+w1-w1/3;a11<2*w1+1.5*w1&&a11<512;a11++){
if(output[a11+1]-output[a11]<3&&output[a11+1]-output[a11]>-3);
else{while(1){if(output[a11+1]>output[a11])w3=++a11;else break;}break;}
// if(output[a11]>output[A])A=a11;
}
// w3=A;
// A=0;
for(a11=3*w1+w
2021电赛A题DSPF28335程序.zip
版权申诉
5星 · 超过95%的资源 160 浏览量
2021-12-07
20:39:33
上传
评论 1
收藏 5KB ZIP 举报
Like_Bamboo
- 粉丝: 817
- 资源: 3万+
最新资源
- C++开发基于ROS实现多差速无人车编队控制源码+使用说明+详细注释 (期末大作业)
- 项目将mzphp结合vuejs、vux、vue-resource做的todoList 代码量不多,重点在于演示 您也可当框架使用
- 基于STC12C5A60S2单片机+ds1302+LCD12864屏实现万年历源程序软件源码KEIL C51工程文件.zip
- 3层独栋别墅-10.20&11.70米- 施工图.dwg
- 简约风车壁纸自动采集小程序源码手机壁纸小程序源码
- UIBezierPath和CAShapeLayer绘图
- Scratch资源 sebcym-v1.4.6.zip
- STM32驱动0.96寸OLED代码
- 中小学教务工具箱v3.7.3
- SI4947ADY-T1-E3-VB一款SOP8封装2个P-Channel场效应MOS管
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
前往页