打印
[ZLG-ARM]

利用中断方式测量PWM波的正脉冲长的问题

[复制链接]
1977|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
malaohu|  楼主 | 2007-9-10 17:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//LPC2214.利用cap0.0的捕获中断方式获取PWM的正脉冲长度,通过串口发送
#include "config.h"

uint32 DUTY=0x12345678;
uint8 flag=0;

void  DelayNS(uint32  dly)
{  uint32  i;
   for(; dly>0; dly--) 
      for(i=0; i<5000; i++);
}

//串口初始化
# define UART0_BR    115200
void UART0_Init(void)
{    uint16 Div;
    U0LCR = 0X83;
    Div = (Fpclk >> 4) / UART0_BR;
    U0DLL = Div;                        //Fdiv % 256;
    U0DLM = Div>>8;                        //Fdiv / 256;
    U0LCR = 0x03;
}

//定时器0初始化
void Timer0_Init(void)
{
    T0PR = 0;                                    //定时器0的时钟不分频
    T0CCR = 0x005;                                //设置CAP1~4上升沿捕获并产生中断
    T0TC = 0;                                    //定时器0设置为0
    T0TCR = 1;
}

//中断函数,测量DUTY
void __irq Timer0_IRQ(void)
{
    uint32 time_0,time_1;
        if(flag==0)
        {
            time_0=T0CR0;                            //记录CAP0.0上升沿捕获的时间
            flag=1;                                //置标志位
            T0CCR=0x006;        //设置CAP0.0下降沿捕获并产生中断    
        }
            
        else
        {    
            time_1=T0CR0;                            //记录CAP0.0下降沿捕获的时间
            flag=0;                                //置标志位
            //获取DUTY值
            if((time_1-time_0)<30000)
            {    DUTY = (time_1-time_0);
            }
            T0CCR=0x005;        //设置CAP0.0上升沿捕获并产生中断    
        }
    T0IR = 0x10;                //一定要清除中断标志位!
    VICVectAddr = 0;            //一定要有中断函数返回语句    
    }

//串口发送函数
void SendBuf(uint8 *pdata)
{    uint8 i;
    for (i=0; i<4; i++)
    {    U0THR = *(pdata++);
        while((U0LSR & 0x20) == 0);        //判断THRE位是否为1?
    }
}

//向量中断初始化
void VICVECT_Init(void)
{    VICIntSelect = 0x00000000;
    VICVectCntl0 = 0X20 | 4;                //使能cap0中断
    VICVectAddr0 = (uint32) Timer0_IRQ;
    VICIntEnable = 1<<4;
}

int main()
{    uint8 data[4];
    PINSEL0 = 0X00000025;                //设置p0.0,p0.1连接到UART0,p0.2连接到cap0.0
    
    UART0_Init();
    Timer0_Init();
    VICVECT_Init();
    
    while(1)
    {    DelayNS(10);
        data[0] = DUTY >> 24;
        data[1] = DUTY >> 16;
        data[2] = DUTY >> 8;
        data[3] = DUTY;
        SendBuf( data );
    }
    return(0);
}

相关帖子

沙发
malaohu|  楼主 | 2007-9-10 17:10 | 只看该作者

利用中断方式测量PWM波的正脉冲长的问题

为什么串口发出来的数总是0x12345678,我的中断也打开了啊,模板中的startup处的系统模式也设了0x5f。

使用特权

评论回复
板凳
wlsui| | 2007-9-10 21:52 | 只看该作者

Re:非常晕

强烈建议楼主静下心来仔细看一遍书,这样会有很大的收获的

使用特权

评论回复
地板
malaohu|  楼主 | 2007-9-11 11:19 | 只看该作者

谢谢楼上,我再仔细看一遍书!PS;问题已解决:)

问题解决了:)好像是等上半天才会进入中断,估计是调试时要等比较久的时间才能等到pwm的上升沿。

我再仔细看遍书,呵呵,每看一遍应该就有一些提高:)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

95

帖子

0

粉丝