dsp 28377d pwm波,adc程序代码模板,已配置3路epwm,4路adc,定时器中断,回调已写好,
最近在搞 DSP 28377D 的开发,今天就跟大家分享下配置 3 路 EPWM、4 路 ADC 以及定时器中断的相关代码模板,还有一些简单的分析。
在 DSP 28377D 里,PWM 波的输出和 ADC 的数据采集是非常常用的功能。比如在电机控制里,PWM 波可以用来控制电机的转速,而 ADC 则可以采集电机的电流、电压等信息。咱们先来看下代码。
代码片段 1:初始化 EPWM
void InitEPWM(void) { // 使能 EPWM 模块时钟 EALLOW; CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0; CpuSysRegs.PCLKCR2.bit.EPWM1 = 1; CpuSysRegs.PCLKCR2.bit.EPWM2 = 1; CpuSysRegs.PCLKCR2.bit.EPWM3 = 1; EDIS; // 初始化 EPWM1 EPwm1Regs.TBPRD = 1000; // 设置周期 EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 计数模式 EPwm1Regs.CMPA.half.CMPA = 500; // 设置比较值 EPwm1Regs.AQCTLA.bit.CAU = AQ_SET; // 比较值匹配时动作 EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR; // 初始化 EPWM2 EPwm2Regs.TBPRD = 1000; EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; EPwm2Regs.CMPA.half.CMPA = 500; EPwm2Regs.AQCTLA.bit.CAU = AQ_SET; EPwm2Regs.AQCTLA.bit.CAD = AQ_CLEAR; // 初始化 EPWM3 EPwm3Regs.TBPRD = 1000; EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; EPwm3Regs.CMPA.half.CMPA = 500; EPwm3Regs.AQCTLA.bit.CAU = AQ_SET; EPwm3Regs.AQCTLA.bit.CAD = AQ_CLEAR; CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1; }代码分析
这段代码主要是对 3 路 EPWM 进行初始化。首先,我们要使能 EPWM 模块的时钟,不然模块就没法工作。TBCLKSYNC这个寄存器先置 0,是为了在配置过程中让时基时钟同步暂时关闭,等配置完再打开。
然后对每一路 EPWM 进行单独配置。TBPRD寄存器设置了 PWM 波的周期,这里设为 1000。TBCTL寄存器的CTRMODE位设置了计数模式,这里用的是上下计数模式。CMPA寄存器设置了比较值,当计数器的值和比较值相等时,就会触发相应的动作,这些动作是由AQCTLA寄存器控制的。
代码片段 2:初始化 ADC
void InitADC(void) { // 使能 ADC 模块时钟 EALLOW; CpuSysRegs.PCLKCR0.bit.ADC_A = 1; CpuSysRegs.PCLKCR0.bit.ADC_B = 1; EDIS; // 复位 ADC AdcaRegs.ADCCTL1.bit.RESET = 1; AdcbRegs.ADCCTL1.bit.RESET = 1; DELAY_US(10); // 配置 ADC AdcaRegs.ADCCTL1.bit.ADCENABLE = 1; AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1; AdcaRegs.ADCCTL1.bit.ADCREFSEL = ADC_REFERENCE_INTERNAL; AdcaRegs.ADCSOC0CTL.bit.CHSEL = 0; // 选择通道 0 AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 5; // 触发源 AdcaRegs.ADCSOC0CTL.bit.ACQPS = 14; // 采样保持时间 AdcaRegs.ADCSOC1CTL.bit.CHSEL = 1; AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 5; AdcaRegs.ADCSOC1CTL.bit.ACQPS = 14; AdcbRegs.ADCSOC0CTL.bit.CHSEL = 0; AdcbRegs.ADCSOC0CTL.bit.TRIGSEL = 5; AdcbRegs.ADCSOC0CTL.bit.ACQPS = 14; AdcbRegs.ADCSOC1CTL.bit.CHSEL = 1; AdcbRegs.ADCSOC1CTL.bit.TRIGSEL = 5; AdcbRegs.ADCSOC1CTL.bit.ACQPS = 14; }代码分析
这段代码是对 4 路 ADC 进行初始化。同样,先使能 ADC 模块的时钟。然后对 ADC 进行复位操作,等 10 微秒让它稳定下来。
接着配置 ADC 的一些参数。ADCENABLE位使能 ADC,ADCPWDNZ位让 ADC 从低功耗模式唤醒。ADCREFSEL选择内部参考电压。ADCSOCxCTL寄存器用来配置每个转换通道的参数,CHSEL选择通道,TRIGSEL选择触发源,ACQPS是采样保持时间。
代码片段 3:定时器中断配置
void InitTimer(void) { // 使能定时器时钟 EALLOW; CpuSysRegs.PCLKCR0.bit.TIMER0ENCLK = 1; EDIS; // 初始化定时器 CpuTimer0Regs.PRD.all = 1000000; // 定时器周期 CpuTimer0Regs.TPR.all = 0; CpuTimer0Regs.TPRH.all = 0; CpuTimer0Regs.TCR.bit.TSS = 0; // 启动定时器 CpuTimer0Regs.TCR.bit.TIE = 1; // 使能定时器中断 // 中断向量表配置 EALLOW; PieVectTable.TIMER0_INT = &timer0_isr; EDIS; // 使能中断 IER |= M_INT1; PieCtrlRegs.PIEIER1.bit.INTx7 = 1; }代码分析
定时器中断在很多应用里都很重要,比如周期性地采集 ADC 数据。这里先使能定时器的时钟,然后配置定时器的周期。PRD寄存器设置了定时器的周期,这里设为 1000000。TSS位用来启动定时器,TIE位使能定时器中断。
接着把定时器中断的服务函数timer0_isr放到中断向量表中,这样当定时器中断发生时,就会跳转到这个函数执行。最后使能相应的中断。
回调函数我已经写好了,不过这里就不展示了,大家可以根据自己的需求在中断服务函数里实现相应的功能。
以上就是 DSP 28377D 配置 3 路 EPWM、4 路 ADC 以及定时器中断的代码模板和简单分析,希望对大家有所帮助。要是有什么问题,欢迎一起讨论!