4000-520-616
欢迎来到免疫在线!(蚂蚁淘生物旗下平台)  请登录 |  免费注册 |  询价篮
主营:原厂直采,平行进口,授权代理(蚂蚁淘为您服务)
咨询热线电话
4000-520-616
当前位置: 首页 > 新闻动态 >
新闻详情
Matlab生成dsp程序——官方例程学习_Quikk的博客-CSDN博客
来自 : CSDN技术社区 发布时间:2021-03-26
/* // Trip Zone Digital Comparator Select Register EPwm1Regs.TZDCSEL.bit.DCAEVT1 // Digital Compare Output A Event 1 EPwm1Regs.TZDCSEL.bit.DCAEVT2 // Digital Compare Output A Event 2 EPwm1Regs.TZDCSEL.bit.DCBEVT1 // Digital Compare Output B Event 1 EPwm1Regs.TZDCSEL.bit.DCBEVT2 // Digital Compare Output B Event 2 EPwm1Regs.TZDCSEL.all (EPwm1Regs.TZDCSEL.all ~0xFFF) | 0x0; /* // Digital Compare Filter Control Register EPwm1Regs.DCFCTL.bit.BLANKE // Blanking Enable/Disable EPwm1Regs.DCFCTL.bit.PULSESEL // Pulse Select for Blanking Capture Alignment EPwm1Regs.DCFCTL.bit.BLANKINV // Blanking Window Inversion EPwm1Regs.DCFCTL.bit.SRCSEL // Filter Block Signal Source Select EPwm1Regs.DCFCTL.all (EPwm1Regs.DCFCTL.all ~0x3F) | 0x10; EPwm1Regs.DCFOFFSET 0; // Digital Compare Filter Offset Register EPwm1Regs.DCFWINDOW 0; // Digital Compare Filter Window Register /* // Digital Compare Capture Control Register EPwm1Regs.DCCAPCTL.bit.CAPE // Counter Capture Enable EPwm1Regs.DCCAPCTL.all (EPwm1Regs.DCCAPCTL.all ~0x1) | 0x0; /* // HRPWM Configuration Register EPwm1Regs.HRCNFG.bit.SWAPAB // Swap EPWMA and EPWMB Outputs Bit EPwm1Regs.HRCNFG.bit.SELOUTB // EPWMB Output Selection Bit EPwm1Regs.HRCNFG.all (EPwm1Regs.HRCNFG.all ~0xA0) | 0x0; /* Update the Link Registers with the link value for all the Compare values and TBPRD */ /* No error is thrown if the ePWM register exists in the model or not */ EPwm1Regs.EPWMXLINK.bit.TBPRDLINK 0; EPwm1Regs.EPWMXLINK.bit.CMPALINK 0; EPwm1Regs.EPWMXLINK.bit.CMPBLINK 0; EPwm1Regs.EPWMXLINK.bit.CMPCLINK 0; EPwm1Regs.EPWMXLINK.bit.CMPDLINK 0; EDIS; EALLOW; CpuSysRegs.PCLKCR0.bit.TBCLKSYNC 1; EDIS; /* End of Start for S-Function (c28xisr_c2000): Root /C28x Hardware Interrupt */
/*接上面的主函数*/rtmSetErrorStatus(c2807x_2837xx_adcpwmasynctes_M, 0); //_M结构体中的错误标志赋值为0c2807x_2837xx_adcpwmasynctest_ert_initialize(); //_M结构体赋值为NULL _B结构体 只有一个ADC 赋值为0configureTimer0(modelBaseRate, systemClock); //开启Timer0中断 中断时长为步长 中断函数 TINT0_isr()runModel  rtmGetErrorStatus(c2807x_2837xx_adcpwmasynctes_M) (NULL); //检测_M中错误标志是否是NULLenableTimer0Interrupt(); //开启Timer0中断enable_interrupts(); //开ADC中断 ADC中断函数为ADCA1_INT_isr()globalInterruptEnable(); //开全局中断while (runModel) stopRequested !( rtmGetErrorStatus(c2807x_2837xx_adcpwmasynctes_M) (NULL)); //stopRequested是一个标志 一直检测_M结构 中的错误标志是否发送了改变/*Terminate mode*/c2807x_2837xx_adcpwmasynctest_ert_terminate(); //空函数与设置中的Custom Code可能有关 以后进行测试一下globalInterruptDisable(); //关中断return 0;}/*主函数完毕*/

   主函数主要是完成了

1.Timer0初始化为0.4s 求解器的步长 进入一次中断

2.初始化了ADC和ePWM模块 按照Simulink中的有关设置

3.在主循环中一直在 获取一个标志位stopRequested 推测可能是一个重要的函数运行/停止的标志

    下面着重看一下两个中断函数 1.**Timer0中断 **[TINT0_isr()] 这个中断并不是我们设置的 是系统求解器自动生成的一个中。可能与系统运行密切相关 。2.**ADC中断 **[ADCA1_INT_isr()] 这个中断可能是完成我们需要的操作 把ADC采集的结果传送到ePWM的CMPA中 进而改变占空比 。

\"在这里插入图片描述\"

  如上图所示,自动生成了以上四个文件 Timer0中断函数就在红框所示文件内。

interrupt void TINT0_isr(void) //#define PIEMASK0 64 //#define IFRMASK 1 #ifdef PIEMASK0 //再MW_c28xx_pie.h文件中进行了相关的声明  volatile unsigned int PIEIER1_stack_save PieCtrlRegs.PIEIER1.all;//PIE1中1.7是Timer0中断 1.1是ADC中断 #endif /* #ifdef PIEMASK1 volatile unsigned int PIEIER2_stack_save PieCtrlRegs.PIEIER2.all; #endif #ifdef PIEMASK2 volatile unsigned int PIEIER3_stack_save PieCtrlRegs.PIEIER3.all; #endif #ifdef PIEMASK3 volatile unsigned int PIEIER4_stack_save PieCtrlRegs.PIEIER4.all; #endif #ifdef PIEMASK4 volatile unsigned int PIEIER5_stack_save PieCtrlRegs.PIEIER5.all; #endif #ifdef PIEMASK5 volatile unsigned int PIEIER6_stack_save PieCtrlRegs.PIEIER6.all; #endif #ifdef PIEMASK6 volatile unsigned int PIEIER7_stack_save PieCtrlRegs.PIEIER7.all; #endif #ifdef PIEMASK7 volatile unsigned int PIEIER8_stack_save PieCtrlRegs.PIEIER8.all; #endif #ifdef PIEMASK8 volatile unsigned int PIEIER9_stack_save PieCtrlRegs.PIEIER9.all; #endif #ifdef PIEMASK9 volatile unsigned int PIEIER10_stack_save PieCtrlRegs.PIEIER10.all; #endif #ifdef PIEMASK10 volatile unsigned int PIEIER11_stack_save PieCtrlRegs.PIEIER11.all; #endif #ifdef PIEMASK11 volatile unsigned int PIEIER12_stack_save PieCtrlRegs.PIEIER12.all; #endif*/ //这一段并不是注释掉了 表示文件中没有宏定义 目前没有起作用 #ifdef PIEMASK0 PieCtrlRegs.PIEIER1.all ~PIEMASK0; /* disable group1 lower/equal priority interrupts */ #endif #ifdef PIEMASK1 PieCtrlRegs.PIEIER2.all ~PIEMASK1; /* disable group2 lower/equal priority interrupts */ #endif #ifdef PIEMASK2 PieCtrlRegs.PIEIER3.all ~PIEMASK2; /* disable group3 lower/equal priority interrupts */ #endif #ifdef PIEMASK3 PieCtrlRegs.PIEIER4.all ~PIEMASK3; /* disable group4 lower/equal priority interrupts */ #endif #ifdef PIEMASK4 PieCtrlRegs.PIEIER5.all ~PIEMASK4; /* disable group5 lower/equal priority interrupts */ #endif #ifdef PIEMASK5 PieCtrlRegs.PIEIER6.all ~PIEMASK5; /* disable group6 lower/equal priority interrupts */ #endif #ifdef PIEMASK6 PieCtrlRegs.PIEIER7.all ~PIEMASK6; /* disable group7 lower/equal priority interrupts */ #endif #ifdef PIEMASK7 PieCtrlRegs.PIEIER8.all ~PIEMASK7; /* disable group8 lower/equal priority interrupts */ #endif #ifdef PIEMASK8 PieCtrlRegs.PIEIER9.all ~PIEMASK8; /* disable group9 lower/equal priority interrupts */ #endif #ifdef PIEMASK9 PieCtrlRegs.PIEIER10.all ~PIEMASK9; /* disable group10 lower/equal priority interrupts */ #endif #ifdef PIEMASK10 PieCtrlRegs.PIEIER11.all ~PIEMASK10; /* disable group11 lower/equal priority interrupts */ #endif #ifdef PIEMASK11 PieCtrlRegs.PIEIER12.all ~PIEMASK11; /* disable group12 lower/equal priority interrupts */ #endif #ifdef PIEMASK12 IER ~(M_INT13); #endif #ifdef PIEMASK13 IER ~(M_INT14); #endif asm( RPT #5 || NOP ); /* wait 5 cycles */ //等待五个周期 IFR ~IFRMASK; /* eventually disable lower/equal priority pending interrupts */ PieCtrlRegs.PIEACK.all IFRMASK; /* ACK to allow other interrupts from the same group to fire */ IER | 1; EINT; /* global interrupt enable */ rt_OneStep(); DINT; /* disable global interrupts during context switch, CPU will enable global interrupts after exiting ISR */ #ifdef PIEMASK0 PieCtrlRegs.PIEIER1.all PIEIER1_stack_save;/*restore PIEIER register that was modified */ #endif  #ifdef PIEMASK1 PieCtrlRegs.PIEIER2.all PIEIER2_stack_save;/*restore PIEIER register that was modified */ #endif #ifdef PIEMASK2 PieCtrlRegs.PIEIER3.all PIEIER3_stack_save;/*restore PIEIER register that was modified */ #endif #ifdef PIEMASK3 PieCtrlRegs.PIEIER4.all PIEIER4_stack_save;/*restore PIEIER register that was modified */ #endif #ifdef PIEMASK4 PieCtrlRegs.PIEIER5.all PIEIER5_stack_save;/*restore PIEIER register that was modified */ #endif #ifdef PIEMASK5 PieCtrlRegs.PIEIER6.all PIEIER6_stack_save;/*restore PIEIER register that was modified */ #endif #ifdef PIEMASK6 PieCtrlRegs.PIEIER7.all PIEIER7_stack_save;/*restore PIEIER register that was modified */ #endif #ifdef PIEMASK7 PieCtrlRegs.PIEIER8.all PIEIER8_stack_save;/*restore PIEIER register that was modified */ #endif #ifdef PIEMASK8 PieCtrlRegs.PIEIER9.all PIEIER9_stack_save;/*restore PIEIER register that was modified */ #endif #ifdef PIEMASK9 PieCtrlRegs.PIEIER10.all PIEIER10_stack_save;/*restore PIEIER register that was modified */ #endif #ifdef PIEMASK10 PieCtrlRegs.PIEIER11.all PIEIER11_stack_save;/*restore PIEIER register that was modified */ #endif #ifdef PIEMASK11 PieCtrlRegs.PIEIER12.all PIEIER12_stack_save;/*restore PIEIER register that was modified */ #endif #ifdef PIEMASK12 IER | M_INT13; #endif #ifdef PIEMASK13 IER | M_INT14; #endif
1.建立一个堆栈PIEIER1_stack_save保存了PIE1的状态

然后是这段代码 PieCtrlRegs.PIEIER1.all ~PIEMASK0; PIEMASK0等于64 即 0100 0000

~PIEMASK0为 1011 1111 与上PIE1之后可以发现 是将1.7 Timer0中断 位进行置零 就是关Timer0中断。

2.然后等待5个周期 将IFR最低位置为0 清除INT1的标志位。

3.将ACK1置为1 禁止同级中断响应。

4.将IER最低位置为1 应答。

5.开启全局中断。

然后进入函数 **rt_OneStep();**本程序中为空函数。[推测跟步长有关的函数将在此函数里面执行 比如GPIO翻转实验中的内容]

6.DINT 关闭全局中断。将PIE恢复为进入时候的状态 即重新开启Timer0中断。

其实感觉真正自己写的话 不用那么复杂。这里可能是Mathwork为了编写程序模块化写程序 进行了一定的固定设置。

下面看一下ADC中断函数 [ADCA1_INT_isr()]

interrupt void ADCA1_INT_isr(void) isr_int1pie1_task_fcn(); EALLOW; AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 1; //清除ADC的标志位 EDIS; PieCtrlRegs.PIEACK.all PIEACK_GROUP1; //应答

主要的函数内容都在**isr_int1pie1_task_fcn()**函数中

void isr_int1pie1_task_fcn(void) /* Call the system: Root /ADC-PWM Subsystem */ /* S-Function (c28xisr_c2000): Root /C28x Hardware Interrupt */ /* Output and update for function-call system: Root /ADC-PWM Subsystem */ /* local block i/o variables */ uint16_T rtb_Gain; /* S-Function (c2802xadc): S1 /ADC */ /* Internal Reference Voltage : Fixed scale 0 to 3.3 V range. */ /* External Reference Voltage : Allowable ranges of VREFHI(ADCINA0) 3.3 and VREFLO(tied to ground) 0 */ c2807x_2837xx_adcpwmasynctest_B.ADC (AdcaResultRegs.ADCRESULT0); //读取ADC采集结果 /* Gain: S1 /Gain */ rtb_Gain (uint16_T)(((uint32_T)c2807x_2837xx_adcpwmasynctest_P.Gain_Gain * c2807x_2837xx_adcpwmasynctest_B.ADC) 13U); //40960 13* ADC的采样结果 5*(ADCresult) /* S-Function (c2802xpwm): S1 /ePWM */ /*-- Update CMPA value for ePWM1 --*/ EPwm1Regs.CMPA.bit.CMPA (uint16_T)(rtb_Gain); //将这个值赋给epwm的CMPA /* End of Outputs for S-Function (c28xisr_c2000): Root /C28x Hardware Interrupt */

这里有点意思 因为Simulink中这里使用的是一个Function Call模块 可以猜想 里面含有其他的模块 可能也在这一部分。

最后看一下MW生成的这些文件都有哪些功能

\"在这里插入图片描述\"

红框内的都是MW生成的文件 其他的都是库文件。

1.c2807x_2837xx_adcpwmasynctest_ert_data.c _data前面都是文件名,所以简记为 data文件 文件中存储了会使用到的一些参数 如这一次的常数5

2.c2807x_2837xx_adcpwmasynctest_ert.c 这文件里面有ADC中断执行的isr_int1pie1_task_fcn函数。**c2807x_2837xx_adcpwmasynctest_ert_step()**函数 **c2807x_2837xx_adcpwmasynctest_ert_initialize **函数 **c2807x_2837xx_adcpwmasynctest_ert_terminate **函数。

可以看出是与模型相关的一些函数。

3.c2837xDBoard_Realtime_Support.c 一些板子的支持函数,通用性的功能函数。

4.c2837xDSchedulerTimer0.c,就是跟求解器步长相关的函数,如果加入积分模块很有可能就在这里运算。

5.MW_c28xGPIO.c,存放初始化GPIO和设置相关GPIO的函数。

6.MW_c28x_adc.c,存放ADC初始化和配置ADC的函数。

7.MW_c28x_board.c,存放初始化时钟和一些配置的相关函数(如外设属于CPU1还是CPU2等等)。

8.MW_c28x_csl.c,存放开启中断,以及中断函数如ADCA1_INT_isr)。

9.MW_c28x_pwm.c,配置开启PWM,需要使用的GPIO。

10.profiler_Support.c,感觉与调试相关。

下面尝试一下,如果不开启ADC中断,将ADC结果乘5赋值给CMPA将在哪部分完成!

\"\"

结果是失败了,目测是跟这个模块关系非常大。

弄明白了,这个是通过CPU中断号和PIE中断号进行服务的中断函数,具体对应关系需要查看帮助文档。

\"在这里插入图片描述\"

\"在这里插入图片描述\"
\"在这里插入图片描述\"

这里给的CPU和PIE号都是1 而且这两个号码还能在模块中配置为向量 看来能够多个中断里面都使用一个函数体。

三、总结

总的来说 整个生成的程序有严格的框架 主要是步长会默认占用一个Timer0的中断 不知道这个能否进行改动。再就是其他的东西都与模型有严格的对照 非常建议第一次学习的时候 将模型和程序进行对照学习 收获会非常非常大的。环境搭建的步骤 我也已经上传了 有需要的可以看我的博文。

本文链接: http://slovergroup.immuno-online.com/view-780802.html

发布于 : 2021-03-26 阅读(0)
公司介绍
品牌分类
催化剂和助剂 Others
联络我们
服务热线:4000-520-616
(限工作日9:00-18:00)
QQ :1570468124
手机:18915418616