📄 pic16cxxx-1-4.htm
字号:
<p align="center"><img src="image/a74.gif" width="275" height="153"></p>
<p align="center">图1.32 比较模块结构</p>
<p align="center"><img src="image/a76.gif" width="669" height="718"></p>
§1.10.3 脉宽调制模式(PWM)<br> <br> 当CCP1工作在PWM模式下,RC2/CCP1可输出高达10位的脉宽调制波形,这时RC2/CCP1
必须设置为输出态(通过置TRISC<2>=1)。在PWM输出模式下,用户把8位的频宽(duty cycle)置入CCPR1寄存器的低8位,即CCPR1L寄存器。CCPR1的高8位寄存器CCPR1H则作为CCPR1L的从属寄存器,即8位频宽数据从CCPR1L再载入CCPR1H然后再和时基寄存器TMR2进行比较,PWM
输出的周期则由TMR2的周期寄存器PR2决定,见图1.33。<br> <div align="center">
<p><img src="image/a77.gif" width="268" height="282"></p>
<p>图1.33 PWM模块结构</p>
</div>
<p><br>
<img src="image/a78.gif" width="349" height="255"> </p>
<p>如下图所示:</p>
<p align="center"><img src="image/a79.gif" width="271" height="166"></p>
<p align="center">图1.34 PWM输出</p>
<p>二、PWM频宽<br>
PWM频宽由CCPR1L和CCP1CON<5:4>组成,所示最大可达10位,其计算公式如下:<br>
PWM 频宽=(CCPR1L:CCP1CON<5:4>)<br>
·Tosc·(TMR2预分频数)<br>
CCPR1L和CCP1CON<5:4>的值可以随时写入,但只有当PR2=TMR2
时,它的值才会载入到CCPR1H中。在PWM模式下,CCPR1H是只读寄存器。</p>
<p align="left"><img src="image/a80.gif" width="284" height="194" hspace="100"></p>
<p align="left"><img src="image/a81.gif" width="334" height="239" hspace="20"></p>
<p align="left"> 所以可以取设最大PWM分辩率为8位。如果要取得更高的分辩率,则必须降低PWM的频率;反之如果要取得更高的PWM频率,则需降低分辩率。<br>
下表列出了PWM频率和分辩率的关系</p>
<p align="center"><img src="image/a82.gif" width="628" height="354"></p>
<p align="center"><img src="image/a83.gif" width="670" height="707"></p>
<p>§1.11 同步串行口(SSP)模块</p>
<p><img src="image/a84.gif" width="423" height="76" hspace="30"> </p>
除PIC16C61外,其余PIC16C6X都有同步串行口模块(以下简称SSP)用来和外围串行器件或其他微处理器进行通讯,这些外围器件可以是串行E2PROM、移位寄存器、显示器、A/D转换器等。SSP有以下二种工作模式:<br>
1.
串行外围接口(简称SPI)<br> 2.
I2C总线<br> 下图是SSP的状态寄存器和控制寄存器,用来对SSP进行控制并记录其各种工作状态。<br>
<p align="center"><img src="image/a85.gif" width="561" height="674">
</p>
<p align="center"><img src="image/a86.gif" width="617" height="932"></p>
<br>
§1.11.1 SPI模式<br> <br>
SPI是Motorola公司推出的一种同步串行传输方式,可同步传送或接收8位数据,由三个引脚来完成通讯工作。<br> 1.
串行数据输出(简称SDO):RC5/SDO<br> 2. 串行数据输入(简称SDI):RC4/SDI<br>
3. 时钟(简称SCK):RC3/SCK<br>
另外当SPI处于"从属操作"模式时,可能还需要第四个脚。<br> 4."从属方式"选择(简称SS):RA5/SS<br>
在初始化SPI工作状态时,必须通过设置其控制寄存器SSPCON<5:0>来确定以下工作方式:<br>
1. 主控方式(SCK作为时钟输出)<br> 2. 从属方式(SCK作为时钟输入)<br>
3. 时钟极性(决定在SCK信号的上升/下降沿来传送数据)<br> 4.
时钟率(仅在主控方式中有用)<br> 5. 从属方式选择(仅在从属方式中有用)<br>
同步串行模块SSP由传送/接收移位寄存器SSPSR和缓冲器SSPUF组成。SSPSR
寄存器用于数据传输的移位,而SSPBUF用于保存置入SSPSR的数据,实际上是起到第二缓冲器的作用。当CPU收到一个8位数据时,就将其存到SSPBUF,并且置缓冲区满标志BF(SSPSTAT<0>)=1
及中断请求位SSPIF(PIR1<3>)=1。由于SSPBUF 起双缓冲区作用,故在第一个接收到的数据未被CPU读取时,SSPSR寄存器即可进行第二个数据的接收。当进行数据传送/接收时,任何试图写SSPBUF的操作都无效,并且将造成写无效标志位WCOL(SSPCON<7>)=1。此时用户必须将WCOL位重新清为零,以便使其能标志后面的SSPBUF写入是否成功。SSPBUF所存放的接收到的数据必须及时读取走,否则可能会被后来的数据覆盖掉。如果发出数据覆盖则溢出标志位SSPOV(SSPCON<6>)被置为1。BF位用来标志SSPBUF是否已经载入了接收数据,当SSPBUF中的数据被读取后,BF位即被清为零。SSP中断会通知CPU数据传输已经完成。如果用户不愿用中断方式,可用软件查询方式来读取和写入SSPBUF中的数据,下例给出对SSPBUF操作的程序:<br>
<p><img src="image/a87.gif" width="456" height="158" hspace="150"><br>
</p>
<p>下图是SSP模块在SPI方式下的结构图。从图中可看到SSPSR寄存器不能被直接读写,用户需通过SSPBUF寄存器来存取它。</p>
<p align="center"><img src="image/a88.gif" width="211" height="299"></p>
<p align="center">图1.37 SPI结构图</p>
<p>要激活使能SSP模块,须置SSPEN(SSPCON<5>)=1。例程如下:</p>
<p><img src="image/a89.gif" width="446" height="255" hspace="150">
</p>
<p> 任何串行口功能在未用时皆可由设置其相应的方面寄存器而另作它用。例如在主控模式下,你只想发送数据,则可将未用到的SDI和SS端当做一般的I/O口线使用。
</p>
<p align="center"><img src="image/a90.gif" width="582" height="272">
</p>
<p align="center">图1.38 SPI主控/从属联接</p>
上图给出两个微处理器相连的典型例子。主控器通过发SCK信号来启动数据传输,数据通过移位寄存器在各自选定的时钟边沿传送,并在下个边沿被锁存,两个处理器必须以相同的时钟极性进行工作,同时发送和接收数据。传送的数据是否有用则由软件来选择,这有以下三种可能:<br>
1. 主控器发送有效数据 ─ 从属器发送无效数据<br>
2. 主控器发送有效数据 ─ 从属器发送有效数据<br>
3. 主控器发送有效无据 ─ 从属器发送有效数据<br>
主控器由于控制着SCK信号,故可在任何时候启动数据传输。在主控器方面,数据一旦置入SSPBUF就可开始读取/传送。此时如果SPI仅做接收工作,则SCK可以省略不要,SSPSR将不停地将其SDI脚上的信号按其选定的时钟节拍移入,收完一字节(8位)后即送入SSPBUF供CPU读取。在从属器方面,数据传送/接收是按SCK脚上的时钟节拍进行,当一字节数据接收完成后,中断请求标志SSPIF=1,发出中断请求。时钟极性可由CKP(SSPCON<4>)设定。
<p> 下面二图给出SPI通讯时序。</p>
<p align="center"><img src="image/a91.gif" width="580" height="162"></p>
<p align="center"> a. 主控方式或不由SS控制的从属方式</p>
<p align="center"><img src="image/a92.gif" width="574" height="189"></p>
<p align="center"> b. SS控制的从属方式<br>
图1.39 SPI方式时序</p>
<p align="right"><a href="PIC16Cxxx-1-3.htm">上一页</a> <a href="PIC16Cxxx-1-5.htm">
下一页</a><br>
</p>
<p><a href="PIC16Cxxx-1.htm">第一章</a> <a href="PIC16Cxxx-2.htm">第二章</a>
<a href="PIC16Cxxx-3.htm">第三章</a> <a href="PIC16Cxxx-4.htm">第四章</a>
<a href="PIC16Cxxx-5.htm">第五章</a> <a href="PIC16Cxxx-6.htm">第六章</a>
<a href="PIC16Cxxx-7.htm">第七章</a> <a href="PIC16Cxxx-8.htm">第八章</a>
<a href="PIC16Cxxx-9.htm">第九章</a> <a href="PIC16Cxxx-10.htm">第十章</a></p></td>
</tr>
</table>
<table width="700" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="20"> </td>
<td> </td>
</tr>
</table>
<table width="700" border="0" cellspacing="0" cellpadding="0">
<tr bgcolor="#990000">
<td height="1" width="634"></td>
</tr>
<tr align="right">
<td height="6"></td>
</tr>
<tr align="right">
<td><font color="#990000" size="2">[ <a href="index.htm">返回</a> ]</font>
</td>
</tr>
<tr>
<td> </td>
</tr>
<tr>
<td> </td>
</tr>
</table></td>
</tr>
</table>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -