//---2014-08-12----//
/*使用GPIO2作为ePWM2a功能引脚,输出方波信号,
将该信号接至ADCINA0,经由ADC采样后,再做FFT分析。
DSP引脚输出高电平为3.3V,而片上ADC最大采样输入
电压为3V,所以会导致采样值饱和,但因GPIO2输出的
是方波信号,所以采样饱和并不影响FFT的谱分析
(相当于采样后是0~3V的矩形波)。读者也可外接信
号发生器,将信号接至ADC转换通道进行实验。
运行程序,查看ADC采样结果数组AdcResult及信号的
FFT谱分析结果数组SpectrumResult*/
#include "DSP2833x_Device.h" //包含头文件
#include "DSP2833x_Examples.h" //包含头文件
#include "FFT_DIT.h" //包含头文件
interrupt void AdcIsr(void); //ADC中断服务函数声明
void InitEPWM2Gpio(); //EPWM2 GPIO口初始化函数声明
void InitEPWM2(); //EPWM2初始化函数声明
void InitMyAdc(void); //ADC初始化函数声明
volatile float AdcResult[FFT_NUM]; //ADC采样结果
volatile Uint16 AdcPnt=0; //保存ADC采样结果用到的位置指针
volatile COMPLEX Signal[FFT_NUM]; //做FFT数组
//-------------------------------------------------主程序---------------------------------------------------//
void main(void)
{
//系统和中断向量表初始化
InitSysCtrl();
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
//中断服务地址重新映射
EALLOW;
PieVectTable.ADCINT = &AdcIsr;
EDIS;
//在PIE级和CPU级,使能ADC中断(INT1.6),开全局中断
PieCtrlRegs.PIEIER1.bit.INTx6 = 1;
IER |= M_INT1;
EINT;
InitAdc(); //使能AD时钟、完成AD校准及上电,该程序可见TI例程DSP2833x_Adc.c文件
InitEPWM2Gpio(); //配置GPIO2为ePWM2a功能
InitEPWM2(); //配置ePWM2模块
InitMyAdc(); //配置ADC
WnGenerate(); //初始化旋转因子
for(;;)
{
if(AdcPnt == FFT_NUM) //当采集了FFT_NUM点后,开始做FFT
{
FFT_DIT(Signal); //调用FFT处理函数
AdcPnt = 0; //数组指针归零,为下次采集做准备
}
}
}
//---------------------------------------- ADC 配置程序-----------------------------------------//
void InitMyAdc(void)
{
AdcRegs.ADCTRL1.bit.CPS = 1; //内核时钟/2分频
AdcRegs.ADCTRL3.bit.ADCCLKPS = 1; //AdcClk = 75MHz/(2*(1+1))=18.75Mhz
AdcRegs.ADCMAXCONV.all = 0x0000; // SEQ1中有一个转换
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; // 转换通道为 ADCINA0
AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1; // 允许ePWM触发SEQ1转换
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; // 允许SEQ1中断
AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1 = 0; //在每个SEQ1转换结束后产生中断
// 配置ePWM1触发ADC
EPwm1Regs.ETSEL.bit.SOCAEN = 1; // 使能ePWMa触发AD转换
EPwm1Regs.ETSEL.bit.SOCASEL = 4; // 选择当计数值递增至CMPA作为触发事件
EPwm1Regs.ETPS.bit.SOCAPRD = 1; // 在第一个触发事件后即产生触发脉冲
EPwm1Regs.TBCTL.bit.CTRMODE = 0; // 增计数模式
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 1; //HSPCLKDIV选择2分频
EPwm1Regs.TBCTL.bit.CLKDIV = 0; //CLKDIV选择不分频
EPwm1Regs.TBPRD = 49999; //设置周期值,采样频率为150M / (1*2)/ (TBPRD+1) = 1500Hz
EPwm1Regs.CMPA.half.CMPA = EPwm1Regs.TBPRD /2; // 设置比较值
}
//---------------------------------------- EPWM2 GPIO配置程序-----------------------------------------//
void InitEPWM2Gpio()
{
EALLOW;
//配置GPIO2为EPWM2a功能
GpioCtrlRegs.GPAPUD.bit.GPIO2 = 0; //使能上拉
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1; //作为EPWM2a功能
EDIS;
}
//---------------------------------------- EPWM2 配置程序-----------------------------------------//
void InitEPWM2()
{
EPwm2Regs.TBCTL.bit.CTRMODE = 0; //连续增计数模式
EPwm2Regs.TBCTL.bit.HSPCLKDIV = 3; //配置高速时钟/6分频
EPwm2Regs.TBCTL.bit.CLKDIV = 2; //对输入时钟/4分频
EPwm2Regs.AQCTLA.bit.ZRO = 2; //计数值为0时,EPWM2a输出高电平
EPwm2Regs.AQCTLA.bit.CAU = 1; //计数值为比较值时,EPWM2a输出低电平
EPwm2Regs.TBPRD = 49999; //配置周期值,信号频率为150M / (6*4)/ (TBPRD+1) = 125Hz
EPwm2Regs.CMPA.half.CMPA = EPwm2Regs.TBPRD/2;//配置比较值
}
//---------------------------------------- ADC采样中断服务程序-----------------------------------------//
interrupt void AdcIsr(void)
{
//读取ADC采样值
if(AdcPnt<FFT_NUM)
{
Signal[AdcPnt].real = 3.0*(AdcRegs.ADCRESULT0 >>4)/4095;
Signal[AdcPnt].imag = 0.0;
AdcResult[AdcPnt] = Signal[AdcPnt].real;//该数组用以画图显示原始采样信号
AdcPnt++;
}
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // 复位排序器至CONV00
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; // 清除SEQ1中断标志位
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // 应答PIE分组中断
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
用于dsp芯片的adc采样,使用GPIO2作为ePWM2a功能引脚,输出方波信号,将该信号接至ADCINA0,经由ADC采样后,再做FFT分析。DSP引脚输出高电平为3.3V,而片上ADC最大采样输入电压为3V,所以会导致采样值饱和,但因GPIO2输出的是方波信号,所以采样饱和并不影响FFT的谱分析(相当于采样后是0~3V的矩形波)。读者也可外接信号发生器,将信号接至ADC转换通道进行实验。
资源推荐
资源详情
资源评论
收起资源包目录
ADC_Main.rar (1个子文件)
ADC_Main.c 4KB
共 1 条
- 1
资源评论
- 不打烊的咩2021-11-09用户下载后在一定时间内未进行评价,系统默认好评。
- gentleman♛2022-05-15用户下载后在一定时间内未进行评价,系统默认好评。
- hanpeng123992022-11-08这个资源对我启发很大,受益匪浅,学到了很多,谢谢分享~
- ASL15652023-04-04怎么能有这么好的资源!只能用感激涕零来形容TAT...
呼啸庄主
- 粉丝: 83
- 资源: 4696
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 使用 C++ (VC6.0) 开发的易语言枚举文件子目录支持库(原“辅助调试支持库”).zip
- leetcode 2. 两数相加
- 临时起意使用Java语言编写的简易邮件服务器,包含客户端和服务端,功能基础但够用(无前端).zip
- 数据结构-顺序表的实现代码
- 一款基于`kotlin`语言开发的简单易用的依赖注入框架,拥有较强的扩展性,可以自定义注入器、拦截器 .zip
- LiuShuaiDong:springboot跨域解决方案
- ShardingSphere - 构建异构数据库上层的标准和生态
- 一款以易语言开发的工具箱,基本上框架已经写好,就差一些bat脚本了,放弃了这个软件1年多了,要搞的机子没希望 .zip
- 智慧工地工地扬尘检测数据集VOC+YOLO格式3382张1类别.zip
- 一个非常简单的C,S型易语言程序,可以实现在同一局域网内聊天,并有传文件功能 .zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功