dsp28335芯片 adc中断方式采样代码
时间: 2023-07-09 16:46:57 浏览: 511
以下是一段基于DSP28335芯片的ADC中断方式采样代码:
```c
#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"
#define ADC_BUF_LEN 16
Uint16 AdcBuf[ADC_BUF_LEN];
interrupt void adc_isr(void)
{
static Uint16 AdcBufIndex = 0;
AdcBuf[AdcBufIndex++] = ADCRESULT0;
if (AdcBufIndex >= ADC_BUF_LEN)
{
AdcBufIndex = 0;
}
// 清除ADC中断标志位
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
void InitAdc(void)
{
// 初始化ADC
AdcRegs.ADCTRL1.bit.RESET = 1;
AdcRegs.ADCTRL1.bit.SUSMOD = 3; // ADC处于软件暂停状态
AdcRegs.ADCTRL1.bit.ACQ_PS = 0; // ADC采样窗口为 1 个 ADCCLK 时钟周期
AdcRegs.ADCTRL1.bit.CPS = 0; // ADC时钟为系统时钟
AdcRegs.ADCTRL1.bit.SEQ_CASC = 0;// 多个序列不级联
AdcRegs.ADCTRL1.bit.CONT_RUN = 1;// 连续采样
AdcRegs.ADCTRL1.bit.CLKDIV2EN = 0;// 不使能ADC结果寄存器访问两倍速
AdcRegs.ADCTRL1.bit.SUSMOD = 0; // ADC处于正常采样状态
AdcRegs.ADCTRL3.bit.ADCCLKPS = 4;// ADCCLK = SYSCLK/(ADCCLKPS+1) = 50MHz/(4+1) = 10MHz
AdcRegs.ADCTRL1.bit.ACQ_PS = 0; // ADC采样窗口为 1 个 ADCCLK 时钟周期
AdcRegs.ADCTRL1.bit.SEQ_OVRD = 1;// 当SEQx位于空闲状态时,SEQy可以立即启动
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;// 使能序列1中断
AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1;// 使能ePWM触发序列1
AdcRegs.ADCSOC0CTL.bit.CHSEL = 0;// ADC采样通道为 A0
AdcRegs.ADCSOC0CTL.bit.ACQPS = 0;// 采样窗口为 1 个 ADCCLK 时钟周期
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 5;// 选择 ePWM 触发
AdcRegs.ADCSOC0CTL.bit.INT_ENA = 1;// 使能 ADC 中断
AdcRegs.ADCSOC0CTL.bit.SOC_SEQ = 0;// 选择 SEQ1
AdcRegs.ADCINTSEL1N2.bit.INT1SEL = 0;// ADC 中断选择 SEQ1
AdcRegs.ADCINTSEL1N2.bit.INT1E = 1;// 使能 ADC 中断
AdcRegs.ADCINTSEL1N2.bit.INT1CONT = 0;// ADC 中断为非连续触发模式
AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;// 清除 ADC 中断标志位
EALLOW;
PieVectTable.ADCA1_INT = &adc_isr; // ADC中断向量表
PieCtrlRegs.PIEIER1.bit.INTx1 = 1; // 使能 ADC 中断
EDIS;
}
void main(void)
{
InitSysCtrl();
InitPieCtrl();
InitAdc();
EnableInterrupts();
while (1)
{
// 等待ADC采样完成
while (AdcRegs.ADCST.bit.INT_SEQ1 == 0);
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;
// 在这里对 AdcBuf 数组进行处理
// ...
}
}
```
代码中使用了ADC的序列1和ePWM触发。在初始化函数中,我们将ADC处于软件暂停状态,然后设置ADC时钟为系统时钟,采样窗口为1个ADCCLK时钟周期,使能ePWM触发序列1,采样通道为A0。在ADC中断服务函数中,将采样结果保存到AdcBuf数组中,并清除ADC中断标志位。在主函数中,等待ADC采样完成,然后对AdcBuf数组进行处理。
阅读全文