2. 配置led模块
/******************************************************************
函数名:void led_gpio(void)
参 数:无
返回值:无
作 用:设置GPIO6、GPIO7为输出模式,作为结果指示灯
******************************************************************/
- void led_gpio(void)
- {
- EALLOW;
- GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 0; //设置GPIO6为普通IO模式
- GpioCtrlRegs.GPADIR.bit.GPIO6 = 1; //设置GOIO6为输出模式
- GpioDataRegs.GPADAT.bit.GPIO6 = 1; //D401灭
- GpioCtrlRegs.GPAMUX1.bit.GPIO7 = 0; //设置GPIO7为普通IO模式
- GpioCtrlRegs.GPADIR.bit.GPIO7 = 1; //设置GOIO7为输出模式
- GpioDataRegs.GPADAT.bit.GPIO7 = 1; //D400灭
- EDIS; // This is needed to disable write to EALLOW protected registers
- }
复制代码
配置epwm模块
/******************************************************************
函数名:void epwm_config()
参 数:无
返回值:无
作 用:产生EPWM1A的波形,产生0x33的高电平,0x265的低电平,将该引脚连接到ECAP的输入引脚
******************************************************************/
- void epwm_config(){
- EPwm1Regs.TBPHS.all = 0x0; //时基相位寄存器:时基计数周期,没有相位控制的问题
- EPwm1Regs.TBPRD = 0x299; //时基周期寄存器:时基计数器周期,设定PWM周期为665个TBCLK时钟周期
- EPwm1Regs.CMPCTL.bit.LOADAMODE = 0; //CMPA影子装载模式下,装载条件选择模式 CTR = 0时,没有用
- EPwm1Regs.CMPCTL.bit.LOADBMODE = 0; //CMPB影子装载模式下,装载条件选择模式 CTR = 0时
- EPwm1Regs.CMPCTL.bit.SHDWAMODE = 1; //计数比较A寄存器为立即装载模式
- EPwm1Regs.CMPA.half.CMPA =0x33; //0x265的低电平,0x33的高电平
- EPwm1Regs.AQCTLA.bit.ZRO = 0; //当时基计数器的值等于0时不动作
- EPwm1Regs.AQCTLA.bit.PRD = 1; //当时基计数器的值与周期寄存器的值相等时,清零,使ePWM1A输出低
- EPwm1Regs.AQCTLA.bit.CAU = 0; //当向上计数时,时基计数器的值与CMPA寄存器的值相等时不动作
- EPwm1Regs.AQCTLA.bit.CAD = 2; //当向下计数时,时基计数器的值与CMPA寄存器的值相等时置位
- EPwm1Regs.TBCTL.bit.CTRMODE = 1; //TBCLK的计数模式为向下计数
- EPwm1Regs.TBCTL.bit.PHSEN = 0; //计数寄存器装载相位寄存器使能位为禁止装载
- EPwm1Regs.TBCTL.bit.PRDLD = 0; //当计数器的值为0时周期寄存器TBPRD装载影子寄存器的值
- EPwm1Regs.TBCTL.bit.SYNCOSEL = 0; //同步信号输出选择,ePWM1SYNCO信号输出源为ePWM1SYNI
- EPwm1Regs.TBCTL.bit.SWFSYNC = 0; //软件强制同步脉冲写0没有效果
- EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0; //TBCTL的高速时钟分频是1分频
- EPwm1Regs.TBCTL.bit.CLKDIV = 0; //TBCTL的低速时钟分频是1分频
- EPwm1Regs.TBCTL.bit.PHSDIR = 0; //同步信号到来时向下计数
- EPwm1Regs.TBCTL.bit.FREE_SOFT = 2; //仿真事件到来时时基计数器的行为是自由运行
- }
复制代码
配置GPIO
/******************************************************************
函数名:void InitEPwm1_Gpio(void)
参 数:无
返回值:无
作 用:配置GPIO0为PWM1A的模式
(GPIO1为PWM1B的模式,GPIO2为PWM2A的模式,GPIO3为PWM2B的模式)
******************************************************************/
- void InitEPwm1_Gpio(void)
- {
- EALLOW;
- GpioCtrlRegs.GPAPUD.bit.GPIO0 = 1;
- GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;
- EDIS;
- }
复制代码
配置GPIO24配置成ecap输入模式
/******************************************************************
函数名:void ECAP_GPIO_Init(void)
参 数:无
返回值:无
作 用:配置GPIO24配置成ecap输入模式,
******************************************************************/
- void ECAP_GPIO_Init(void)
- {
- EALLOW;
- GpioCtrlRegs.GPAPUD.bit.GPIO5 = 0; //Enable pull-up on GPIO5(CAP1) 28027
- GpioCtrlRegs.GPAQSEL1.bit.GPIO5 = 1; //Synch to SYSCLKOUT GPIO5(CAP1)
- GpioCtrlRegs.GPAMUX1.bit.GPIO5 = 3; //Configure GPIO5 as CAP1
- EDIS;
- }
复制代码
配置ECAP捕获
/******************************************************************
函数名:void ECAP_config(void)
参 数:无
返回值:无
作 用:配置CAP1下降沿捕获,在CAP1事件中重置计数器。在CAP2上升沿捕获,
CAP2事件中重置计数器。在CAP3下降沿捕获,在CAP3事件中重置计数器。
在CAP4上升沿捕获,在CAP4事件中重置计数器
******************************************************************/
- void ECAP_config(void)
- {
- EALLOW;
- ECap1Regs.ECEINT.all = 0x0000; //不使能所有ecap中断
- ECap1Regs.ECCLR.all = 0xFFFF;
- ECap1Regs.ECCTL1.bit.FREE_SOFT = 0x3; //仿真控制,不受仿真模式影响
- ECap1Regs.ECCTL1.bit.CAPLDEN = 0; //禁止在捕获事件中加载CAP1-4寄存器的时间
- ECap1Regs.ECCTL2.bit.TSCTRSTOP = 0; //计数器停止
- ECap1Regs.ECCTL2.bit.STOP_WRAP = 3;
- ECap1Regs.ECCTL1.bit.CTRRST4 = 1; //在CAP4事件中重置计数器
- ECap1Regs.ECCTL1.bit.CAP4POL = 0; //在CAP4上升沿捕获(RE)
- ECap1Regs.ECCTL1.bit.CTRRST3 = 1; //在CAP3事件中重置计数器
- ECap1Regs.ECCTL1.bit.CAP3POL = 1; //CAP3下降沿捕捉
- ECap1Regs.ECCTL1.bit.CTRRST2 = 1; //在CAP2事件中重置计数器
- ECap1Regs.ECCTL1.bit.CAP2POL = 0; //在CAP2上升沿捕捉
- ECap1Regs.ECCTL1.bit.CTRRST1 = 1;//0 //在CAP1事件中重置计数器
- ECap1Regs.ECCTL1.bit.CAP1POL = 1; //CAP1下降沿捕捉
- ECap1Regs.ECCTL2.bit.CAP_APWM = 0; //eCAP模式工作于捕获模式
- ECap1Regs.ECCTL2.bit.SWSYNC = 0; //软件强制计数同步,它提供一个简便的软件方法使一些或者所有eCAP时基同步
- // ,等于0无影响
- ECap1Regs.ECCTL2.bit.SYNCO_SEL = 0;//0x2; //屏蔽同步信号输出
- ECap1Regs.ECCTL2.bit.SYNCI_EN = 1;//0; //计数器同步输入选择模式
- // ECap1Regs.ECCTL2.bit.REARM = 0x1; //
- //ECap1Regs.ECCTL2.bit.STOP_WRAP = 0x1; //连续模式下,在CAP4的捕获事件发生后计数器正常运行
- ECap1Regs.ECCTL2.bit.CONT_ONESHT = 0; //连续模式
- ECap1Regs.ECCTL1.bit.CAPLDEN = 1; //使能在捕获事件中加载CAP1-4寄存器的时间
- ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1; //计数器计数
- ECap1Regs.ECEINT.bit.CEVT4 = 1;
- EDIS;
- }
复制代码
ECAP中断服务程序
/******************************************************************
函数名:INTERRUPT void ecap_isr()
参 数:无
返回值:无
作 用:ECAP1的中断服务程序。此中断服务程序,在满足CAP4事件时产生,
采集PWM1A的脉冲,其中CAP1的结果是0x33,CAP2的结果是0x265,
CAP3的结果是0x33,CAP4的结果是0x265
******************************************************************/
- INTERRUPT void ecap_isr(){
- int a, b, c, d, e;
- ECap1Regs.ECCLR.bit.INT = 1; //全局中断标志,清除该位标志位,不影响中断的使能
- ECap1Regs.ECCLR.bit.CEVT1 = 1; //清除CEVT1该位标志位
- ECap1Regs.ECCLR.bit.CEVT2 = 1; //清除CEVT2该位标志位
- ECap1Regs.ECCLR.bit.CEVT3 = 1; //清除CEVT3该位标志位
- ECap1Regs.ECCLR.bit.CEVT4 = 1; //清除CEVT4该位标志位
- a = ECap1Regs.CAP1; //这个寄存器的作用:在CMP模式中,加载捕获事情中的时间标志(TSCTR的计数值)
- b = ECap1Regs.CAP2;
- c = ECap1Regs.CAP3;
- if((abs(c - 0x33))>1) //误差1>1,错误
- {
- GpioDataRegs.GPADAT.bit.GPIO6 = 0; //D401亮,错误
- }
- else
- {
- correct_flag1 = 1; //误差1<1,正确
- }
- d = ECap1Regs.CAP4;
- if((abs(d - 0x265))>1) //误差2>1,错误
- {
- GpioDataRegs.GPADAT.bit.GPIO6 = 0; //D401亮,错误
- }
- else
- {
- correct_flag2 = 1; //误差2<1,正确
- }
- if((correct_flag1 == 1)&&(correct_flag2 == 1)) //误差1和误差2都<1,正确
- {
- GpioDataRegs.GPADAT.bit.GPIO7 = 0; //D400亮,正确
- }
- EALLOW;
- PieCtrlRegs.PIEACK.all = 0xffff; //PIE中断应答寄存器当该寄存器等于1时,
- //说明来自中断组的中断向量已经向CPU发送了中断请求,该中断组的其他中断目前被锁存
- //向相应的中断位写1,可以让该位清零,并且让PIE模块产生一个脉冲给CPU中断,以使得CPU可以响应该组中尚未被相应的中断
- EDIS;
- }
复制代码
3. main函数
- int main(void)
- {
- volatile unsigned int i;
- InitSysCtrl(); //将PLL配置成bypass 1分频,配置系统时钟为12M
- InitEPwm1_Gpio();
- epwm_config();
- led_gpio();
- DINT; //清除所有的中断并且初始化PIE向量表 不使能CPU中断
- IER_DISABLE(0xffff); //禁能所有中断
- IFR_DISABLE(0xffff); //清所有中断标志位
- InitPieVectTable(); //初始化向量表
- ECAP_GPIO_Init();
- ECAP_config();
- EALLOW; // This is needed to write to EALLOW protected register
- PieVectTable.ECAP1_INT = &ecap_isr;
- EDIS; // This is needed to disable write to EALLOW protected registers
- PieCtrlRegs.PIEIER4.bit.INTx1 = 1; // Enable INT 4.1 in the PIE
- // PieCtrlRegs.PIEIER1.bit.INTx7 = 1; // Enable INT 1.7 in the PIE
- IER_ENABLE(M_INT4);
- EINT; // Enable Global interrupt INTM
- ERTM; // Enable Global realtime interrupt DBGM
- while(1){
- }
- return 0;
- }
复制代码
4. 接线:P203的GPIO0连接GPIO5
5. 点击编译、编译完成后点击下载
6. 运行结果:
D400灯亮。
晶振频率为12M,pwm1A的波形配置成高电平0x33,低电平0x265;
Add Watch Expression:ECap1Regs.CAP1(=0x33)、ECap1Regs.CAP2(=0x265)、ECap1Regs.CAP3(=0x33)、ECap1Regs.CAP4(=0x265)