STC15编程之矩阵寻迹(第一天)

言之者无罪,闻之者足以戒。 - “诗序”

有了硬件电路以及电路板之后,紧接着就是写程序控制小车按照黑线的路径行驶。

我写程序的思路是:

第一步:配置15的PCA实现PWM的控速

第二步:实现矩阵的扫描(如果不能一次扫描完成,可以分行来逐次扫描)

第三步:读取扫描的数据

第四步:根据读取的数据实现小车的控制

一、首先来说一下PCA的配置:

1、PCA模块的逻辑结构

STC15F2K60S2单片机内部集成了3路可编程计数器阵列PCA模块,可实现软件定时器、外部脉冲捕捉、高速输出以及脉冲调制PWM输出等。PCA模块含有一个特殊的16位定时器,有3个16位的捕获/比较模块与之相连,其逻辑图如下,每一个模块可编程为上升/下降沿捕获、软件定时器、高速输出、脉宽调制输出等4种工作方式。(我使用的是STC15F2K60S2)

16位PCA定时器/计数器是3个模块的公共时间基准,其结构如下:

寄存器CH和CL构成16位PCA的自动增量计数器,PCA计数器的时钟源来自系统时钟的1~12分频,或定时器T0溢出脉冲,或ECI引脚(P1^2或P2^3或P3^4)的输入脉冲,可通过设置特殊功能寄存器CMOD中的CPS2、CPS1、CPS0位进行选择。

PCA计数器由工作模式寄存器CMOD和控制寄存器CCON进行管理和控制。

2、与PCA模块相关的特殊功能寄存器

STC15F2K60S2单片机与PCA模块相关的特殊功能寄存器如图所示:

 

寄存器名地址MSBLSB复位值
CMODD9HCIDL---CPS2CPS1CPS0ECF0XXX0000
CCOND8HCFCR---CCF2CCF1CCF000XXX000
AUXR1A2HS1_S1S1_S0CCP_S1CCP_S0SPL_S1SPL_S00DPS00000000
CCAPM0DAH-ECOM0CAPP0CAPN0MAT0TOG0PWM0ECCF0X000X000
CCAPM1DBH-ECOM1CAPP1CAPN1MAT1TOG1PWM1ECCF1X000X000
CCAPM2DCH-ECOM2CAPP2CAPN2MAT2TOG2PWM2ECCF2X000X000
PCA_PWM0F2HEBS0_1EBS0_0----EPC0HEPC0L00XXXX00
PCA_PWM1F3HEBS1_1EBS1_0----EPC1HEPC1L00XXXX00
PCA_PWM2F4HEBS2_1EBS2_0----EPC2HEPC2L00XXXX00
CHF9HPCA十六位计数器的高八位    00000000
CLE9HPCA十六位计数器的低八位    00000000
CCAP0HFAHPCA模块0捕获/比较寄存器的高八位   00000000
CCAP0LEAHPCA模块0捕获/比较寄存器的低八位   00000000
CCAP1HFBHPCA模块1捕获/比较寄存器的高八位   00000000
CCAP1LEBHPCA模块1捕获/比较寄存器的低八位   00000000
CCAP2HFCHPCA模块2捕获/比较寄存器的高八位   00000000
CCAP2LECHPCA模块2捕获/比较寄存器的低八位   00000000

(1)、PCA模块工作模式寄存器CMOD用于选择计数脉冲来源中断管理。其中CIDL位用于设定空闲模式下是否PCA计数,CIDL=0,空闲模式下PCA计数器继续计数,CIDL= 1,空闲模式下PCA停止计数。

CPS2,CPS1,CPS0位用于选择计数脉冲来源,如图所示:

CPS2CPS2CPS2PCA计数脉冲来源
000系统时钟/12
001系统时钟/2
010定时器T0溢出脉冲
011ECI引脚输入脉冲
100系统时钟
101系统时钟/4
110系统时钟/6
111系统时钟/8

ECF 位为PCA中断允许控制位,ECF=1,允许PCA计数器中断,ECF=0,禁止PCA计数器中断。

(2)、PCA模块控制寄存器CCON用于控制16位PCA计数器的运行计数脉冲源与记录PCA/PWM模块的中断请求标志。其中CF位是PCA计数器溢出标志,当计数溢出时,CF由硬件置1,这时如果CMOD寄存器中的ECF为1,则会向CPU发出中断请求。CF位可通过硬件或软件置1,但只能通过软件清 0。

CR为PCA计数器运行启动控制位,CR=1 ,启动PCA计数,CR=0 ,停止PCA计数。

CCF2、CCF1、CCF0分别是PCA模块2、模块1和模块0的中断请求标志,当发生匹配或捕获时由硬件置1,需要软件清0.

(3)、辅助寄存器AUXR1中CCP_S1、CCP_S0位用于实现PCA模块功能引脚在不同端口进行切换,如下表所示:

CCP_S1CCP_S0PCA模块功能引脚
CCP_S1CCP_S0ECICCP0CCP1CCP2
00P1^2P1^1P1^0P3^7
01P3^4(ECI_2)P3^5(CCP0_2)P3^6(CCP1_2)P3^7(CCP2_2)
10P2^4(ECI_3)P2^5(CCP0_3)P2^6(CCP1_3)P2^7(CCP2_3)
11无效无效 无效无效

(4)、PCA模块比较/捕获控制寄存器CCAPMn(n=0/1/2)中用于控制PCA模块的比较和捕获功能。

其中 ECOMn是比较功能允许控制位,ECOMn=1,允许比较 功能。

CAPPn为正捕获控制位,CAPPn=1,允许上升沿捕获。

CAPNn为负捕获控制位,CAPPn=1,允许下降沿捕获。

MATn 为匹配控制位,如果MATn=1 ,当PCA计数值(CH、CL)与模块的比较/捕获寄存器(CCAPnH、CCAPnL)匹配时,CCON寄存器中的中断标志CCFn 被置1.

TOGn为翻转控制位,如果TOGn=1,PCA模块工作于高速输出模式,当PCA计数值与模块的比较/捕获寄存器的匹配时,将使PCAn 引脚信号翻转。

PWMn为脉宽调制模式控制位,如果PWM n=1,PCA工作于脉宽调制输出模式,PCAn引脚作用脉宽调制输出。

ECCFn为PCA模块中断允许控制位,与CCON寄存器中的CCFn比较/捕获 中断请求标志配合,用来产生PCA模块中断,ECCFn=1,允许产生中断,ECCFn=0,禁止产生中断。

PCA模块工作模式设置如表所示:

ECOMnCAPPnCAPNnMATnTOGnPWMnECCFn设定值PCA模块功能
000000000H无操作
100001042HPWM,无中断
110001163HPWM,上升沿触发中断
101001153HPWM,下降沿触发中断
111001173HPWM,跳变沿触发中断
x10000x21H16位捕获方式,上升沿触发
x 1000x11H16位捕获方式,下降沿触发
x11000x31H16位捕获方式,跳变沿触发
100100x49H16位软件定时器
100110x4DH16位高速输出

(5)、PCA模块PWM寄存器PCA_PWMn用于PWM功能控制。其中EBSn_1、EBSn_0位用于选择PWM的位数,如表所示:

EBSn_1EBSn_0PWM位数
008
017
106
11无效,仍为8位

EPCnH位在PWM模式下,与CCAPnH寄存器的值一起组成9位数。

EPCnL位在PWM模式下,与CCAPnL寄存器的值一起组成9位数。

(6)、PCA模块的16位计数器CH、CL用于保存计数值的高8位和低8位。

(7)、PCA模块的捕获/比较寄存器CCAPnH、CCAPnL用于保存各模块的16位捕获计数值,当PCA模块工作于PWM模式时,它们用于控制输出占空比。

看完这些寄存器的配置就应该可以控制PWM的输出,调节占空比来实现速度的调节了。

下面来看一下15PWM调速的代码:

/*PWM控速初始化函数*/
void PWM_Init(int set_PWM1,int set_PWM2)
{
	AUXR1 &= 0XCF;
    CCON = 0X00;                       //初始化PCA控制寄存器,PCA定时器停止,清除CF标志,清除模块中断标志                               
	CL = 0X00;                         //复位PCA寄存器
    CH = 0X00;
	CMOD = 0X02;				//设置PCA时钟(系统时钟/2),禁止PCA计数器中断	
	CCAP0H = CCAP0L = set_PWM1;
	CCAP1H = CCAP1L = set_PWM2;
	CCAPM0 = 0x42;                  //PCA模块0为8位PWM模式
	CCAPM1 = 0x42;                  //PCA模块0为8位PWM模式
	PCA_PWM1 = 0x00;                //PCA模块0工作于8位PWM
	PCA_PWM0 = 0x00;                //PCA模块0工作于8位PWM
	CR = 1;												 //PCA定时器开始工作
}

 

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值