<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>木客网 &#187; c8051</title>
	<atom:link href="http://woodfeed.com/tag/c8051/feed/" rel="self" type="application/rss+xml" />
	<link>http://woodfeed.com</link>
	<description></description>
	<lastBuildDate>Wed, 09 Jun 2010 12:15:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>C8051f020产生16位PWM</title>
		<link>http://woodfeed.com/implementing-16-bit-pwm-using-the-pca-with-c8051f020/</link>
		<comments>http://woodfeed.com/implementing-16-bit-pwm-using-the-pca-with-c8051f020/#comments</comments>
		<pubDate>Thu, 13 Aug 2009 10:35:39 +0000</pubDate>
		<dc:creator>vayu</dc:creator>
				<category><![CDATA[8051f020]]></category>
		<category><![CDATA[c8051]]></category>
		<category><![CDATA[pca]]></category>
		<category><![CDATA[pwm]]></category>

		<guid isPermaLink="false">http://woodfeed.com/?p=285</guid>
		<description><![CDATA[脉冲宽度调制（PWM）波形常用于闭环反馈和控制应用，例如：控制加热单元的开关状态以调节DWDM（波分复用）系统中激光器的温度。在某些应用中可编程计数器阵列（PCA）的内建8位PWM方式不能提供任务所需要的足够的分辨率。本应用笔记介绍如何用PCA的‘高速输出’方式和最小的软件开销来产生一个16位分辨率的PWM波形。]]></description>
			<content:encoded><![CDATA[<p>脉冲宽度调制（PWM）波形常用于闭环反馈和控制应用，例如：控制加热单元的开关状态以调节DWDM（波分复用）系统中激光器的温度。在某些应用中可编程计数器阵列（PCA）的内建8位PWM方式不能提供任务所需要的足够的分辨率。本应用笔记介绍如何用PCA的‘高速输出’方式和最小的软件开销来产生一个16位分辨率的PWM波形。<br />
用于闭环控制应用的PWM信号的频率并不重要，只要波形足够快就可以了，象控制系统的阶跃响应时间就应远远小于PWM信号的周期。信号所携带的的信息用波形的占空度来编码，占空度是波形为高电平的时间与PWM信号的周期之比。对于一个PWM实现来说，其输入是一个数值，通常为整数，该数值与所要求的输出波形的占空度成正比。<br />
在一个基于8051的设计中，有很多方法用于产生PWM波形:软件循环,查询或中断驱动的定时器等.本应用笔记中的例子使用可编程计数器阵列PCA.相对于任何查询机制基于软件或定时器而言,使用PCA产生PWM可以大大降低所需要的CPU带宽,并可以消除在中断驱动的基于定时器的设计中因中断延迟不一致而产生的时序抖动。<br />
PCA包含一个16位的计数器/定时器和5个捕捉/比较模块如图2所示计数器/定时器有一个16位的计数器/定时器寄存器PCA0H:PCA0L一个用于选择时间基准的方式寄存器PCA0MD和一个包含计数器/定时器运行控制及各模块捕捉/比较标志的控制寄存器PCA0CN每个捕捉/比较模块有一个用于选择模块工作方式边沿触发捕捉软件定时器高速输出或PWM的配置寄存器PCA0CPMx和一个16位的捕捉/比较寄存器。<br />
PCA0CPHn:PCA0CPLn由于所有的捕捉/比较模块共享一个时间基准因此它们同步工作例如在电机控制应用中可以提供锁相激励波形另外由于每个模块有其自己的控制和捕捉/比较寄存器因此每一个模块工作上又独立于其它模块只要任何一个模块的服务程序都不影响共享的时间基准停止或重新设置计数器/定时器改变计数器/定时器的时钟源本应用笔记中的例子将PCA配置为独立工作每个模块的服务程序只影响该模块的配置寄存器和捕捉/比较寄存器PCA方式寄存器设置一次后不再改变让计数器/定时器寄存器PCA0H: PCA0L自由运行。<br />
PCA包含一个16位的计数器/定时器和5个捕捉/比较模块。计数器/定时器有一个16位的计数器/定时器寄存器PCA0H:PCA0L、一个用于选择时间基准的方式寄存器PCA0MD和一个包含计数器/定时器运行控制及各模块捕捉/比较标志的控制寄存器PCA0CN。每个捕捉/比较模块有一个用于选择模块工作方式（边沿触发、捕捉软件、定时器高速输出或PWM）的配置寄存器PCA0CPMx和一个16位的捕捉/比较寄存器PCA0CPHn:PCA0CPLn。<br />
由于所有的捕捉/比较模块共享一个时间基准，因此它们同步工作，例如在电机控制应用中可以提供锁相激励波形。另外，由于每个模块有其自己的控制和捕捉/比较寄存器，因此每一个模块工作上又独立于其它模块，只要任何一个模块的服务程序都不影响共享的时间基准（停止或重新设置计数器/定时器、改变计数器/定时器的时钟源）。<br />
PCA的时基信号可以是下述四个时钟源之一SYSCLK/12、SYSCLK/4、定时器0溢出、或出现在一个外部引脚ECI上的下降沿。<br />
用PCA产生16位PWM  为了产生一个具有16位精度的PWM波形，我们将PCA模块配置为高速输出方式。在该方式下，每当主定时器/计数器的寄存器PCA0H:PCA0L与模块的捕捉/比较寄存器PCA0CPHn:PCA0CPLn相匹配时CEXn引脚发生电平转换并可以选择产生中断。</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span> SysClkInit<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span><span style="color: #666666; font-style: italic;">//配置系统时钟</span>
&nbsp;
<span style="color: #009900;">&#123;</span>
 <span style="color: #993333;">int</span> n <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
 OSCXCN <span style="color: #339933;">=</span> <span style="color: #208080;">0x67</span><span style="color: #339933;">;</span>
 <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>n <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> n <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">255</span><span style="color: #339933;">;</span> n<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span>
 <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#40;</span>OSCXCN <span style="color: #339933;">&amp;</span> <span style="color: #208080;">0x80</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 OSCICN <span style="color: #339933;">=</span> <span style="color: #208080;">0x0C</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> SystemInit<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span><span style="color: #666666; font-style: italic;">//系统配置</span>
<span style="color: #009900;">&#123;</span>
WDTCN <span style="color: #339933;">=</span> <span style="color: #208080;">0xDE</span><span style="color: #339933;">;</span>   <span style="color: #666666; font-style: italic;">// 关闭 WDT</span>
WDTCN <span style="color: #339933;">=</span> <span style="color: #208080;">0xAD</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> PortInit<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span><span style="color: #666666; font-style: italic;">//端口配置</span>
<span style="color: #009900;">&#123;</span>
<span style="color: #666666; font-style: italic;">//交叉开关配置</span>
 XBR0 <span style="color: #339933;">=</span> <span style="color: #208080;">0x10</span><span style="color: #339933;">;</span>
 XBR1 <span style="color: #339933;">=</span> <span style="color: #208080;">0x00</span><span style="color: #339933;">;</span>
 XBR2 <span style="color: #339933;">=</span> <span style="color: #208080;">0x40</span><span style="color: #339933;">;</span>
 <span style="color: #666666; font-style: italic;">// P0 口分配状况</span>
 <span style="color: #666666; font-style: italic;">// P0.0 = CEX0</span>
 <span style="color: #666666; font-style: italic;">// P0.1 = CEX0</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> PCA_Init<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
 EIE1 <span style="color: #339933;">|=</span> <span style="color: #208080;">0x08</span><span style="color: #339933;">;</span>
 PCA0MD <span style="color: #339933;">=</span> <span style="color: #208080;">0X01</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//系统时钟的12分频</span>
 PCA0L <span style="color: #339933;">=</span> <span style="color: #208080;">0x00</span><span style="color: #339933;">;</span>
 PCA0H <span style="color: #339933;">=</span> <span style="color: #208080;">0x00</span><span style="color: #339933;">;</span>
 PCA0CPM0 <span style="color: #339933;">=</span> <span style="color: #208080;">0xcb</span><span style="color: #339933;">;</span>
 PCA0CPM1 <span style="color: #339933;">=</span> <span style="color: #208080;">0xcb</span><span style="color: #339933;">;</span>
 PCA0CPM0 <span style="color: #339933;">|=</span> <span style="color: #208080;">0x40</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//开启CCFn中断</span>
 PCA0CPM1 <span style="color: #339933;">|=</span> <span style="color: #208080;">0x40</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//开启CCFn中断</span>
 <span style="color: #666666; font-style: italic;">//PWM频率计算：系统时钟/12/计数=22118400/12/65536=28.125</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> PCA_CPHL0<span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> PWM<span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #009900;">&#123;</span>
 PCA0CN <span style="color: #339933;">&amp;=</span> ~<span style="color: #208080;">0x40</span><span style="color: #339933;">;</span>
 PCA0CPL0 <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #208080;">0xff</span> <span style="color: #339933;">&amp;</span>  PWM<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 PCA0CPH0 <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #208080;">0xff</span> <span style="color: #339933;">&amp;</span> <span style="color: #009900;">&#40;</span>PWM <span style="color: #339933;">&gt;&gt;</span> <span style="color: #0000dd;">8</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 PCA0CN <span style="color: #339933;">|=</span> <span style="color: #208080;">0x40</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> PCA_CPHL1<span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> PWM<span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #009900;">&#123;</span>
 PCA0CN <span style="color: #339933;">&amp;=</span> ~<span style="color: #208080;">0x40</span><span style="color: #339933;">;</span>
 PCA0CPL1 <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #208080;">0xff</span> <span style="color: #339933;">&amp;</span> PWM<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 PCA0CPH1 <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #208080;">0xff</span> <span style="color: #339933;">&amp;</span><span style="color: #009900;">&#40;</span>PWM <span style="color: #339933;">&gt;&gt;</span> <span style="color: #0000dd;">8</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 PCA0CN <span style="color: #339933;">|=</span> <span style="color: #208080;">0x40</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> PCA_ISR<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span> interrupt <span style="color: #0000dd;">9</span>
<span style="color: #009900;">&#123;</span>
 <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>CCF0<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
 CCF0 <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>CCF1<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
 CCF1 <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>CF<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
 CF <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<h2  class="related_post_title">精彩文章</h2><ul class="related_post"><li><a href="http://woodfeed.com/incremental-pid-algorithm/" title="增量式PID算法">增量式PID算法</a><br /><small>所谓增量式PID是指数字控制器的输出只是控制量的增量kuΔ。当执行机构需要的控制量是增量...</small></li><li><a href="http://woodfeed.com/php-code-for-301-redirect/" title="简单PHP代码实现301地址重定向">简单PHP代码实现301地址重定向</a><br /><small>重定向就是将网页自动转向重定向，即：301永久性重定向和302临时性重定向。实施301后...</small></li><li><a href="http://woodfeed.com/a-new-domain-name-laeon-com/" title="注册了一个域名laeon.com">注册了一个域名laeon.com</a><br /><small>前几天又去注册了一个域名，在雅虎注册的，2刀。准备过2个月转出去~
这个比较短，五个字...</small></li><li><a href="http://woodfeed.com/network-security-and-information-security/" title="网络安全与信息安全">网络安全与信息安全</a><br /><small>主要内容：1、密码学、鉴别 
　2、访问控制、计算机病毒 
　3、网络安全技术 
...</small></li><li><a href="http://woodfeed.com/detailed-description-of-commonly-used-linux-commands-4/" title="Linux常用命令详解(4)">Linux常用命令详解(4)</a><br /><small>五 磁盘维护
1 mkfs(make file system)
六 系统设置
1 exp...</small></li><li><a href="http://woodfeed.com/switching-technology/" title="交换技术">交换技术</a><br /><small>主要内容：1、线路交换
　2、分组交换
　3、帧中继交换
　4、信元交换...</small></li><li><a href="http://woodfeed.com/location-type-pid-control-algorithm/" title="位置式PID控制算法">位置式PID控制算法</a><br /><small>输出值与阀门开度一一对应，所以称为位置式PID控制算法。...</small></li><li><a href="http://woodfeed.com/detailed-description-of-commonly-used-linux-commands-6/" title="Linux常用命令详解(6)">Linux常用命令详解(6)</a><br /><small>八 网络通迅
1 ifconfig 2 netconfig 3 netstat 4 pi...</small></li><li><a href="http://woodfeed.com/vmware-virtual-machine-under-linux-network/" title="VMWare虚拟机下linux联网">VMWare虚拟机下linux联网</a><br /><small>VMWare虚拟机下安装的RedHat 9.0 linux有三种方式实现上网，桥接、na...</small></li><li><a href="http://woodfeed.com/uip-transplantation/" title="uIP移植">uIP移植</a><br /><small>uIP的设备驱动程序接口。uIP内核中有两个函数直接需要底层设备驱动程序的支持。一是ui...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://woodfeed.com/implementing-16-bit-pwm-using-the-pca-with-c8051f020/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
