[DSP编程] 28335的定时器触发adc采样,两个中断都能进去,但是采样值...

[复制链接]
2849|0
 楼主| 毛毛只爱宝宝 发表于 2017-9-15 10:20 | 显示全部楼层 |阅读模式
本帖最后由 毛毛只爱宝宝 于 2017-9-15 10:23 编辑

采集的是一个正弦波,通过数组Voltage1来观察数据和波形。但是采样值基本无变化,这是为什么呢?下面附上程序:
主函数:
  1. void main(void)
  2. {
  3.      EALLOW;
  4.           SysCtrlRegs.HISPCP.all = ADC_MODCLK;  // HSPCLK = SYSCLKOUT/2*ADC_MODCLK
  5.           EDIS;
  6.     int i;
  7.     InitSysCtrl();//初始化系统函数
  8.     IER = 0x0000;//禁止CPU中断
  9.     IFR = 0x0000;//清除CPU中断标志
  10.     InitPieCtrl();//初始化PIE控制寄存器
  11.     InitPieVectTable();//初始化PIE中断向量表
  12.     InitCpuTimers();
  13.        InitEPwm1Gpio();
  14.        InitEPwm2Gpio();
  15.        InitEPwm3Gpio();
  16.    DINT;
  17.    InitAdc();//ADC初始化
  18.       EALLOW;
  19.       SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;//禁止PWM时钟
  20.       EDIS;
  21.       InitEPwm1Example();
  22.       InitEPwm2Example();
  23.       InitEPwm3Example();
  24.           ConfigCpuTimer(&CpuTimer0,30,1000);
  25.           StartCpuTimer0();//启动定时器0
  26.           PieCtrlRegs.PIECTRL.bit.ENPIE = 1;//使能PIE模块的总中断
  27.             EALLOW;
  28.             SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;//使能PWM时钟
  29.             EDIS;

  30.           EALLOW;  // This is needed to write to EALLOW protected register
  31.            PieVectTable.TINT0 = &TINT0_ISR;//使能Timer0中断
  32.            PieVectTable.ADCINT = &ADCINT_ISR;//使能ADC中断

  33.           EDIS;    // This is needed to disable write to EALLOW protected registers
  34.           PieCtrlRegs.PIEIER1.bit.INTx7 = 1; //使能PIE中断的CPU定时器0
  35.           PieCtrlRegs.PIEIER1.bit.INTx6 = 1; //使能PIE中断中的ADC中断
  36.           IER |= (M_INT1); // Enable CPU Interrupt 1
  37.           EINT;   //使能全局中断
  38.           ERTM;   //使能实时中断
  39. for (i=0; i<BUF_SIZE; i++)
  40.       {
  41.         Voltage1[i] = 0;
  42.         Voltage2[i] = 0;
  43.         Voltage3[i] = 0;
  44.       }

定时器中断函数:
  1. Uint16 q=0;
  2. interrupt void  TINT0_ISR(void)      // CPU-Timer 0
  3. {
  4.   // Insert ISR Code here
  5.         q++;//判断是否进入中断
  6.         AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1;//软件触发启动SEQ1
  7.         PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;

ADC中断函数:
  1. Uint16 qa=0;
  2. interrupt void ADCINT_ISR(void) // ADC
  3. {
  4. // Insert ISR Code here
  5. qa++;//判断是否进入中断
  6. // To receive more interrupts from this PIE group, acknowledge this interrupt
  7. // PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;

  8. // Next two lines for debug only to halt the processor here
  9. // Remove after inserting ISR Code
  10. Uint16 a[10],b[10],c[10];
  11. Uint16 i,j,r,s,t;
  12. Voltage1[ConversionCount1++] = AdcRegs.ADCRESULT0 >>4;
  13. Voltage2[ConversionCount2++] = AdcRegs.ADCRESULT1 >>4;
  14. Voltage3[ConversionCount3++] = AdcRegs.ADCRESULT2 >>4;
  15. if(ConversionCount1>(511))
  16. ConversionCount1=0;
  17. DELAY_US(100);

  18. AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // Reset SEQ1
  19. AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; // Clear INT SEQ1 bit
  20. PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // Acknowledge interrupt to PIE

ADC初始化函数:
  1. extern void DSP28x_usDelay(Uint32 Count);

  2.         EALLOW;
  3.         SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;//使能ADC时钟
  4.         ADC_cal();
  5.         EDIS;
  6. AdcRegs.ADCTRL1.bit.RESET = 1;    //Reset ADC module
  7.             asm(" RPT #20||NOP");
  8.     AdcRegs.ADCTRL3.all = 0x00E0;  // 给ADC内部上电
  9.     DELAY_US(ADC_usDELAY);         // 在ADC转换前要延时一段时间
  10. AdcRegs.ADCTRL1.bit.ACQ_PS = 0xff;  // Sequential mode: Sample rate   = 1/[(2+ACQ_PS)*ADC clock in ns]
  11.                                       //                     = 1/(3*40ns) =8.3MHz (for 150 MHz SYSCLKOUT)
  12.                                     //                     = 1/(3*80ns) =4.17MHz (for 100 MHz SYSCLKOUT)
  13.                                     // If Simultaneous mode enabled: Sample rate = 1/[(3+ACQ_PS)*ADC clock in ns]
  14.                  AdcRegs.ADCTRL3.bit.ADCCLKPS = 0;//不分频
  15.                  AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;        // 1  Cascaded mode
  16.                  AdcRegs.ADCTRL1.bit.CONT_RUN = 1;       // Setup continuous run
  17.                  AdcRegs.ADCTRL1.bit.SEQ_OVRD = 1;       // Enable Sequencer override feature
  18.                  AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x2;  // convert and store in 8 results registers
  19.                  AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; // Setup ADCINA3 as 1st SEQ1 conv.
  20.                  AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1;
  21.                  AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x2;// Setup ADCINA2 as 2nd SEQ1 conv.
  22.                  AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;  // 向CPU发出中断申请

您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

52

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部