[ZLG-ARM] 利用中断方式测量PWM波的正脉冲长的问题

[复制链接]
2697|3
 楼主| malaohu 发表于 2007-9-10 17:09 | 显示全部楼层 |阅读模式
//LPC2214.利用cap0.0的捕获中断方式获取PWM的正脉冲长度,通过串口发送<br />#include&nbsp;&quot;config.h&quot;<br /><br />uint32&nbsp;DUTY=0x12345678;<br />uint8&nbsp;flag=0;<br /><br />void&nbsp;&nbsp;DelayNS(uint32&nbsp;&nbsp;dly)<br />{&nbsp;&nbsp;uint32&nbsp;&nbsp;i;<br />&nbsp;&nbsp;&nbsp;for(;&nbsp;dly&gt0;&nbsp;dly--)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;&nbsp;i&lt5000;&nbsp;i++);<br />}<br /><br />//串口初始化<br />#&nbsp;define&nbsp;UART0_BR&nbsp;&nbsp;&nbsp;&nbsp;115200<br />void&nbsp;UART0_Init(void)<br />{&nbsp;&nbsp;&nbsp;&nbsp;uint16&nbsp;Div;<br />&nbsp;&nbsp;&nbsp;&nbsp;U0LCR&nbsp;=&nbsp;0X83;<br />&nbsp;&nbsp;&nbsp;&nbsp;Div&nbsp;=&nbsp;(Fpclk&nbsp;&gt&gt&nbsp;4)&nbsp;/&nbsp;UART0_BR;<br />&nbsp;&nbsp;&nbsp;&nbsp;U0DLL&nbsp;=&nbsp;Div;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Fdiv&nbsp;%&nbsp;256;<br />&nbsp;&nbsp;&nbsp;&nbsp;U0DLM&nbsp;=&nbsp;Div&gt&gt8;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Fdiv&nbsp;/&nbsp;256;<br />&nbsp;&nbsp;&nbsp;&nbsp;U0LCR&nbsp;=&nbsp;0x03;<br />}<br /><br />//定时器0初始化<br />void&nbsp;Timer0_Init(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;T0PR&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//定时器0的时钟不分频<br />&nbsp;&nbsp;&nbsp;&nbsp;T0CCR&nbsp;=&nbsp;0x005;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置CAP1~4上升沿捕获并产生中断<br />&nbsp;&nbsp;&nbsp;&nbsp;T0TC&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//定时器0设置为0<br />&nbsp;&nbsp;&nbsp;&nbsp;T0TCR&nbsp;=&nbsp;1;<br />}<br /><br />//中断函数,测量DUTY<br />void&nbsp;__irq&nbsp;Timer0_IRQ(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint32&nbsp;time_0,time_1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(flag==0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;time_0=T0CR0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//记录CAP0.0上升沿捕获的时间<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//置标志位<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T0CCR=0x006;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置CAP0.0下降沿捕获并产生中断&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;time_1=T0CR0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//记录CAP0.0下降沿捕获的时间<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//置标志位<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//获取DUTY值<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((time_1-time_0)&lt30000)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;DUTY&nbsp;=&nbsp;(time_1-time_0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T0CCR=0x005;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置CAP0.0上升沿捕获并产生中断&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;T0IR&nbsp;=&nbsp;0x10;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//一定要清除中断标志位!<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//一定要有中断函数返回语句&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />//串口发送函数<br />void&nbsp;SendBuf(uint8&nbsp;*pdata)<br />{&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i=0;&nbsp;i&lt4;&nbsp;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;U0THR&nbsp;=&nbsp;*(pdata++);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while((U0LSR&nbsp;&&nbsp;0x20)&nbsp;==&nbsp;0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//判断THRE位是否为1?<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />//向量中断初始化<br />void&nbsp;VICVECT_Init(void)<br />{&nbsp;&nbsp;&nbsp;&nbsp;VICIntSelect&nbsp;=&nbsp;0x00000000;<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectCntl0&nbsp;=&nbsp;0X20&nbsp;|&nbsp;4;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//使能cap0中断<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr0&nbsp;=&nbsp;(uint32)&nbsp;Timer0_IRQ;<br />&nbsp;&nbsp;&nbsp;&nbsp;VICIntEnable&nbsp;=&nbsp;1&lt&lt4;<br />}<br /><br />int&nbsp;main()<br />{&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;data[4];<br />&nbsp;&nbsp;&nbsp;&nbsp;PINSEL0&nbsp;=&nbsp;0X00000025;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置p0.0,p0.1连接到UART0,p0.2连接到cap0.0<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;UART0_Init();<br />&nbsp;&nbsp;&nbsp;&nbsp;Timer0_Init();<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVECT_Init();<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;DelayNS(10);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data[0]&nbsp;=&nbsp;DUTY&nbsp;&gt&gt&nbsp;24;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data[1]&nbsp;=&nbsp;DUTY&nbsp;&gt&gt&nbsp;16;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data[2]&nbsp;=&nbsp;DUTY&nbsp;&gt&gt&nbsp;8;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data[3]&nbsp;=&nbsp;DUTY;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendBuf(&nbsp;data&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;return(0);<br />}<br />
 楼主| malaohu 发表于 2007-9-10 17:10 | 显示全部楼层

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

为什么串口发出来的数总是0x12345678,我的中断也打开了啊,模板中的startup处的系统模式也设了0x5f。<br />
wlsui 发表于 2007-9-10 21:52 | 显示全部楼层

Re:非常晕

强烈建议楼主静下心来仔细看一遍书,这样会有很大的收获的
 楼主| malaohu 发表于 2007-9-11 11:19 | 显示全部楼层

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

问题解决了:)好像是等上半天才会进入中断,估计是调试时要等比较久的时间才能等到pwm的上升沿。<br /><br />我再仔细看遍书,呵呵,每看一遍应该就有一些提高:)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

95

帖子

0

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