单片机pca模块_单片机pca功能模块 应用 - CSDN
  • 带有SPI接口,PCA模块,定时器输出,16K+的片上ROM,越来越妖孽了!前面见识了定时器输出功能,现在来领教一下STC12C5A60S单片机的PCA捕捉比较模块,后面有心情再看看SPI模块。  按我个人理解捕捉比较的意思应该是...

        STC12C5系列单片机属于增强性单片机,有多强呢?带有SPI接口,PCA模块,定时器输出,16K+的片上ROM,越来越妖孽了!前面见识了定时器输出功能,现在来领教一下STC12C5A60S单片机的PCA捕捉比较模块,后面有心情再看看SPI模块。

        按我个人理解捕捉比较的意思应该是捕捉外部引脚上的跳变,与预设的值比较,然后做相应的动作。下文按这个理解展开。老规矩,寄存器功能介绍省略了,懒得抄手册了。

        虽然说寄存器设置的说明不介绍,不过表格还是得给一张,这样条理比较清晰,如下:

       

    1)PCA模块PWM的应用,感觉设置寄存器最少的一个:

    PWM(脉宽调制,改变输出方波的占空比)估计拥有最广泛的应用空间(恕我眼见浅),据说常有人用PWM做心跳灯向妹子表白,不知道有没有成功;还有改变直流电机的输出转速。。。 

    怎么理解PWM这个功能呢?刚去了趟WC突然想到了:在一个有0xFF个刻度的跑表上,CH是秒表,CCAPnH是表面上的一个绊脚石,当CH遇到绊脚石,直接给跪了,一直跪到下一轮0x00,继续站起来行走。如果CCAPnH没被移动,CH还在同一个地方周而复始的摔倒(人说不要再同一个地方摔倒)。然后计算从0x00-0xFF这段时间里,CH站着走路占了这段时间的百分之几,给跪占了剩下的多少(路遇倒地不扶也就算了还做应用题)!

    #include <STC\STC12C5A.H>
    
    enum sState
    {
        sInit=0,sPca,sClk,sPwm,sClkOut,
    };
    
    #define CCF1_INT 0x02
    #define CCF0_INT 0x01
    
    #define ResetPCA() \
    do{ \
        CCON = 0; \
        CL = 0; \
        CH = 0; \
        CMOD = 0x00; \
        CCAPM0 = 0x00; \
        CCAPM1 = 0x00; \
    }while(0); \
    
    #define StartPCA() \
    do{ \
        CR = 1; \
    }while(0); \
    
    #define StopPCA() \
    do{ \
        CR = 0; \
    }while(0); \
    
    #define SetModnCmp(n) \
    do{ \ 
        CCAPM##n |= PCA0_ECOM; \
        CCAPM##n |= PCA0_MAT; \    
    }while(0); \
    
    #define SetModnTog(n) \
    do{ \
        CCAPM##n |= PCA0_TOG; \
    }while(0); \
    
    #define SetCapnMod(n,mod) \
    do{ \
        CCAPM##n |= mod; \
    }while(0); \
    
    #define SetCCAPn(n,hi,lo) \
    do{ \
        CCAP##n##H = hi; \
        CCAP##n##L = lo; \    
    }while(0); \
    //ECCFn 使能CCFn中断。使能寄存器CCON的比较/捕获标志CCFn,用来产生中断。
    #define EnPcaModnInt(n) \
    do{ \
        CCAPM##n |= PCA0_ECCF; \    
    }while(0); \
    
    //PCA0_ECOM 允许比较器功能控制位
    //PCA0_PWM 脉宽调制模式。当PWMn=1时,CEXn脚用作脉宽调制输出
    #define SetPwmMod(n) \
    do{ \
        CCAPM##n |= PCA0_ECOM|PCA0_PWM; \    
    }while(0); \
    
    unsigned int CCAPnHVal = 0x80,CCAPnLVal = 0x80; 
    
    void delay()
    {
        int i=0,j=0;
        for(i=0;i<1000;i++)
        {
            for(j=0;j<110;j++);
        }
    }
    
    int main()
    {
        unsigned char sState = sInit;
        ResetPCA();
        //pwm有比较功能 但没用到匹配...真特立独行
        //只要设置CCAPMn的PWM位和比较位
        SetPwmMod(0);
        
        //设置占空比,有点类似定时器Mod2,TH自动装载到TL
        //此处是CCAPnH自动装载到CCAPnL(8位);CH装载到CL(8位)
        //CH-CL低于    CCAPnH-CCAPnL输出0,其他输出1
        while(1)
        {
            StopPCA();
            SetCCAPn(0,CCAPnHVal,CCAPnLVal);
            if(CCAPnHVal == 0xF0)
                CCAPnLVal = CCAPnHVal = 0x00;
            else
                CCAPnLVal = CCAPnHVal = CCAPnLVal+0x10;
            //启动pca模块
            StartPCA();
            delay();
        }
    }

    PWM0的输出引脚是P1.3在我的开发板上正好连了一个红色LED,忽明忽亮的,眼都刺瞎了!用示波器测试时的确输出可变的波形。(无图无真相随我BB)

    本来想用中断控制pwm占空比,不过没成功,没法调试好麻烦,只能用这种粗线条的延时了。

    2) 在看PCA捕捉功能之前,先看下51MCU的计数器功能,PCA的捕捉功能应该是加强版计数器:

    2a) 51的定时器对系统时钟计数,计满诺干个时钟脉冲后,产生溢出;计数器对外部输入信号计数,计满诺干负跳变后,产生溢出。传说,计算流水线上的工件数会用到计数器功能。想象一下点钞机里的票票经过光感时,使计数器不断的加一,想想是不是有点小激动?醒醒了,拿钱不是自己的。还是看下面的代码了

    #include <reg51.h>
    
    #define MakeByte(target, Hi,Lo) \  
    do{ \  
        target |= (((Hi)<<4)|(Lo)); \   
    }while(0); \  
      
    #define SetTH(n,val) \  
    do{ \  
        TH##n = val; \  
    }while(0); \  
      
    #define SetTL(n,val)  \  
    do{ \  
        TL##n = val; \  
    }while(0); \  
      
    #define EnableET(n) \  
    do{ \  
        ET##n = 0x01; \  
        IE |= 0x80; \  
    }while(0); \
    
    #define StartClk(val) \
    do{ \
    	TCON |= val; \
    }while(0); \
    
    sbit P10=P1^0;
    
    int main()
    {
    	//T0工作在方式2 计数器模式
    	MakeByte(TMOD,0x00,0x06);
    	SetTH(0,0xFF);
    	SetTL(0,0xFF);
    		
    	EnableET(0);
    	//启动定时器
    	StartClk(0x10);
    	while(1);
    }  
    
    void IsrT0() interrupt 1 
    {
        //TH自动装入0xFF,再计满一个负跳变又能进入isr
        P10 = ~P10;	
    }
    程序对P3.4引脚采样,遇到负跳变计数器加1,因为设置计数溢出是0xFF,因此只要有负跳变就产生中断,对P1.0引脚取反。因为文章是关于PCA的,所以不能安排MCU计数器模块抢了镜头~

    蓝色波形是信号发生器的输出,黄色波形是P1.0的输出。因为2个负跳变产生一个完整的波形,因此P1.0方波周期正好对应2个信号发生器的周期。

    2b) 回到文章的主角PCA模块,当PCA模块工作在捕获模式时,对外部输入CEXn(P13/P14)的跳变进行采样。当采样到有效跳变时,PCA硬件将PCA计数器阵列寄存器(CH和CL)的值装载到捕获寄存器(CCAPnH和CCAPnL)中。如果CCON中的CCFn位和CCAPMn中的ECCFn位被置位,将产生中断。

    #include <STC\STC12C5A.H>
    
    enum sState
    {
    	sInit=0,sPca,sClk,sPwm,sClkOut,
    };
    
    #define CCF1_INT 0x02
    #define CCF0_INT 0x01
    
    #define ResetPCA() \
    do{ \
    	CCON = 0; \
    	CL = 0; \
    	CH = 0; \
    	CMOD = 0x00; \
    	CCAPM0 = 0x00; \
    	CCAPM1 = 0x00; \
    }while(0); \
    
    #define StartPCA() \
    do{ \
    	CR = 1; \
    }while(0); \
    
    #define StopPCA() \
    do{ \
    	CR = 0; \
    }while(0); \
    
    #define SetModnCmp(n) \
    do{ \ 
    	CCAPM##n |= PCA0_ECOM; \
    	CCAPM##n |= PCA0_MAT; \	
    }while(0); \
    
    #define SetModnTog(n) \
    do{ \
    	CCAPM##n |= PCA0_TOG; \
    }while(0); \
    
    #define SetCapnMod(n,mod) \
    do{ \
    	CCAPM##n |= mod; \
    }while(0); \
    
    #define SetCCAPn(n,hi,lo) \
    do{ \
    	CCAP##n##H = hi; \
    	CCAP##n##L = lo; \	
    }while(0); \
    //ECCFn 使能CCFn中断。使能寄存器CCON的比较/捕获标志CCFn,用来产生中断。
    #define EnPcaModnInt(n) \
    do{ \
    	CCAPM##n |= PCA0_ECCF; \	
    }while(0); \
    
    //PCA0_ECOM 允许比较器功能控制位
    //PCA0_PWM 脉宽调制模式。当PWMn=1时,CEXn脚用作脉宽调制输出
    #define SetPwmMod(n) \
    do{ \
    	CCAPM##n |= PCA0_ECOM|PCA0_PWM; \	
    }while(0); \
    
    //当PCA模块工作在捕获模式时,对外部输入CEXn的跳变进行采样。
    //当采样到有效跳变时,PCA硬件将PCA计数器阵列寄存器(CH和CL)的值装载到捕获寄存器(CCAPnH和CCAPnL)中。
    //如果CCON中的CCFn位和CCAPMn中的ECCFn位被置位,将产生中断。
    //当P1.3出现下降沿时产生中断 对P1.5取反
    
    void delay()
    {
        int i=0,j=0;
        for(i=0;i<200;i++)
        {
            for(j=0;j<110;j++);
        }
    }
    
    int main()
    {
    	unsigned char sState = sInit;
    	ResetPCA();
    	EA = 1;
    	//捕捉模式,捕捉到跳变沿时触发中断
    	//CH-CL不用与CCAPnH-CCAPnL比较,因此不用使能ECOMn
    	//也不需要设置PCA计数器阵列寄存器(CH和CL)以及捕获寄存器(CCAPnH和CCAPnL)
    	SetCapnMod(0,PCA0_CAPN);
    	//开启PCA中断
    	EnPcaModnInt(0);
    	//启动pca模块
    	StartPCA();
    	while(1)
    	{
    		P12 = ~P12;	
    		delay();
    	}	
    }
    
    void PCA_ISR(void) interrupt 7
    {
    	switch(CCON&0x03)
    	{
    	//模块0触发中断
    	case CCF0_INT:
    		//清除模块中断标志位
    		CCON &=	(0x00<<CCF0_INT);
    		P15 = ~P15;
    		break;
    	//模块1触发中断
    	case CCF1_INT:
    		CCON &=	(0x00<<CCF1_INT);
    		break;
    	default:
    		break;
    	}
    }
    程序烧写到MCU后,用跳线帽连接P12和P13,使得P13对P12的输出经行采样。下面是示波器的输出:

    蓝色波形是P12引脚的输出,黄色波形是P15引脚的输出。图中(我的低端示波器)可以很明显的看出P13上采样到一个负跳表,P15发生一次翻转。

    这个功能跟计数器每次计满一个脉冲就触发中断类似,不过感觉没有计数器那么灵活,它可以计数256个跳变,不过PCA捕捉可以同时捕捉双边沿,可用于脉宽测量;


    STC MCU PCA模块还有其他功能,不过感觉有点无聊,就不一一展示了,不过代码还是要贴上来已做备忘:

    #include <STC\STC12C5A.H>
    
    enum sState
    {
    	sInit=0,sPca,sClk,sPwm,sClkOut,
    };
    
    #define CCF1_INT 0x02
    #define CCF0_INT 0x01
    
    #define ResetPCA() \
    do{ \
    	CCON = 0; \
    	CL = 0; \
    	CH = 0; \
    	CMOD = 0x00; \
    	CCAPM0 = 0x00; \
    	CCAPM1 = 0x00; \
    }while(0); \
    
    #define StartPCA() \
    do{ \
    	CR = 1; \
    }while(0); \
    
    #define SetModnCmp(n) \
    do{ \ 
    	CCAPM##n |= PCA0_ECOM; \
    	CCAPM##n |= PCA0_MAT; \	
    }while(0); \
    
    #define SetModnTog(n) \
    do{ \
    	CCAPM##n |= PCA0_TOG; \
    }while(0); \
    
    #define SetCapnMod(n,mod) \
    do{ \
    	CCAPM##n |= mod; \
    }while(0); \
    
    #define SetCCAPn(n,hi,lo) \
    do{ \
    	CCAP##n##H = hi; \
    	CCAP##n##L = lo; \	
    }while(0); \
    //
    #define EnPcaModnInt(n) \
    do{ \
    	CCAPM##n |= PCA0_ECCF; \	
    }while(0); \
    
    #define SetPwmMod(n) \
    do{ \
    	CCAPM##n |= PCA0_ECOM|PCA0_PWM; \	
    }while(0); \
    
    int main()
    {
    	unsigned char sState = sInit;
    
    	ResetPCA();
    	EA = 1;
    	while(1)
    	{
    		switch(sState)
    		{
    		case sInit:
    			//输入提示
    			break;
    		default: 
    			
    			sState = sInit;
    			break;
    		case sPca:
    			ResetPCA();
    			//捕捉模式,捕捉到跳变沿时触发中断
    			//CH-CL不用与CCAPnH-CCAPnL比较,因此不用使能ECOMn
    			//也不需要设置PCA计数器阵列寄存器(CH和CL)以及捕获寄存器(CCAPnH和CCAPnL)
    			SetCapnMod(0,PCA0_CAPN|PCA0_CAPP);
    			//开启PCA中断
    			EnPcaModnInt(0);
    			sState = sInit;
    			break;
    		case sClk:
                            //软件定时器功能
                            ResetPCA();
    			//定时器功能
    			//CH-CL增加计数值,然后与CCAPnH和CCAPnL比较,相等触发中断
    			//有比较功能 设置比较和匹配控制位
    			SetModnCmp(0);
    			//设置 CCAPnH和CCAPnL,当CH-CL计数值==CCAPnH-CCAPnL中的预制值
    			//发生中断
    			SetCCAPn(0,0x80,0x00);
    			//开启PCA中断
    			EnPcaModnInt(0);
    			sState = sInit;
    			break;
    		case sPwm:
    			ResetPCA();
    			//pwm有比较功能 但没用到匹配...真特立独行
    			//只要设置CCAPMn的PWM位和比较位
    			SetPwmMod(0);
    			//设置占空比,有点类似定时器Mod2,TH自动装载到TL
    			//此处是CCAPnH自动装载到此处是CCAPnL(8位);CH装载到CL(8位)
    			//CH-CL低于	CCAPnH-CCAPnL输出0,其他输出1
    			SetCCAPn(0,0x80,0x80);
    			sState = sInit;
    			break;
    		case sClkOut:
                            //高速输出功能
                            ResetPCA();
    			//当PCA计数器的CH-CL与CCAPnH-CCAPnL中的预制值相等时
    			//CCPn发生翻转,这个功能也用到比较-匹配
    			SetModnCmp(0);
    			SetModnTog(0);
    			EnPcaModnInt(0);
    			sState = sInit;
    			break;  				 
    		}
    		//启动pca模块
    		StartPCA();	
    	}
    }
    
    void PCA_ISR(void) interrupt 7
    {
    	switch(CCON&0x03)
    	{
    	//模块0触发中断
    	case CCF0_INT:
    		//清除模块中断标志位
    		CCON &=	(0x00<<CCF0_INT);
    		break;
    	//模块1触发中断
    	case CCF1_INT:
    		CCON &=	(0x00<<CCF1_INT);
    		break;
    	default:
    		break;
    	}
    }


    展开全文
  • 单片机PCA和PWM的关系

    2019-12-21 14:36:06
    这里写自定义目录标题单片机PCA和PWM的关系 单片机PCA和PWM的关系 PCA指的是单片机的一个功能模块,然后PWM指的是脉冲宽度调制,是一种技术。 使用单片机的PCA模块可以实现PWM功能,比如要输出一个固定的频率,那么...

    这里写自定义目录标题

    单片机PCA和PWM的关系

    PCA指的是单片机的一个功能模块,然后PWM指的是脉冲宽度调制,是一种技术。

    使用单片机的PCA模块可以实现PWM功能,比如要输出一个固定的频率,那么单片机只要开机时,把PCA的相关寄存器配置一下,频率就出来了,就是后台运行了,单片机就可以去做其他的事情,想连续发脉冲时,不中断其他运行中的程序。多路发出也可以,频率也可以不同,关键看单片机的功能。

    PCA指的试可编程计数器阵列,就是说的PWM模块了,有这个的,就一定有PWM功能,不只是PWM,还有好多其他功能,比如捕捉(测脉宽)、高速输出、频率输出等。

    这里的意思是。传统51的定时器是没有PWM功能的,但是PHILIP的增强型51,它的定时器有这功能,所以单独提出说明了,即定时器自己就能输出PWM。
    有PCA的意思是,在定时器的基础上,实现了一些其它的功能,实现这个工能的东西是PCA。
    有PCA的单片机,PWM、捕捉、高速输出、频率输出等都可以用模块完成;没有PCA、有PWM的单片机,PWM是靠定时器自己就能自动做了,但其他的功能要靠程序去做。都没有的,自然就都要靠程序去实现,要中断。

    展开全文
  • STC单片机(具有PCA功能的),怎么硬件实现可变频率的PWM输出。很多朋友还在使用定时器做可变频PWM。 这里我就具体并仅介绍,怎么使用硬件PWM,在定时器0的分频基数下设计PWM。    首先看CMOD这个寄存器,这里...

    本文转载自http://bbs.elecfans.com/jishu_546043_1_1.html

    STC单片机(具有PCA功能的),怎么硬件实现可变频率的PWM输出。很多朋友还在使用定时器做可变频PWM。 这里我就具体并仅介绍,怎么使用硬件PWM,在定时器0的分频基数下设计PWM。

         
        首先看CMOD这个寄存器,这里我们主要关注 CPS0,CPS1,CPS2,这三个位控制选择PCA的计数脉冲源。 对应PWM功能,则是选择频率。   首先可以选择 6个固定分频,可以看图片看出,分别是1,2,4,6,8,12的系统分频。我们需要做可变频率的PWM,所以我们需要选择模式2,选择定时器0的溢出作为系统分频基数。
         
      然后,我么看怎么具体的去计算,去实现分频。  这里就需要上面这个图片的计算规则。   这里我举一个例子来说明,比如我们单片机的晶振使用的是12MHZ,而我们需要实现300HZ的频率。 如果得到呢?
      首先,如果我们采用CMOD的固定分频,可以发现,无论是1,2,4,8,12,分频下来的频率都不是300HZ。 所以这里也体现我们使用定时器0做分频基数的好处了。
      我们继续计算,12MHZ需要转化为300HZ,那么根据上图,首先我们需要确定PCA时钟输入频率,根据公式 300*256=76800HZ,这个值就是我们需要的PCA时钟输入频率。现在问题就是 ,我们怎么把12MHZ,转化为76.8KHZ, 12000KHZ/76.8KHZ=156.25  ,这个156.25就是分频基数,而这个分频基数由我们的定时器溢出参数来设定,意思就是当我们定时器如果计数156.25溢出就可以做到分频基数为156.25, 所以我们在设置定时器0的计数起始值就是65536-156=65380,对应TH0=0XFF,TL0=0X64。
      好了,怎么计算PWM在定时器0下实现我们自己需要的任意频率的计算方式这里就介绍完了。  如果要动态实现频率可变,我们就可以通过通讯去动态调整定时器0的计数基数,(实际就是调整了分频基数),就可以实现频率的改变了。  另外,说明:这里的定时器0,不需要中断,并且该定时器也不是作为产生PWM用的,是作为一个分频基数用!
    在经过反复的尝试中,发现,在使用T0作为PCA时钟源时,T0的工作模式必须在1T下,而且,在定时器0中断中,必须进行重装
    展开全文
  • 利用STC12C5410AD自带的4路PCA,扩展4路外部中断;利用4路外部中断来对输入的脉冲序列进行计数。 备注: 本文工程文件里还涉及到STC12C5410AD的UART、Time0等接口函数,请读者自行理解 一、PCA16位定时器计数器...

    文本中的工程文件下载地址:http://download.csdn.net/detail/cgb165937385/5310549

    任务:

    利用STC12C5410AD自带的4PCA,扩展4路外部中断;利用4路外部中断来对输入的脉冲序列进行计数。

    备注:

    本文工程文件里还涉及到STC12C5410ADUARTTime0等接口函数,请读者自行理解

    一、PCA16位定时器计数器结构

    从图中得知,要产生PCA溢出中断需要进行一下设置:

    1、 选择PCA16计数器的时钟源。时钟源的选择由PCACMOD寄存器的CPS1CPS0决定。

    2、 IDLECIDL必须有一位为0(常规的置CIDL0

    3、 CR必须置1,允许计数器开始计数

    4、 CMODECF必须置1,以允许CCOD中的CF位在产生中断时:CF=1

    5、 需要给PCA16位计数器CHCL赋初值

    二、PCA捕获模式

    PCA工作于捕获模式需要进行一下设置:(主要是配合CCON寄存器和CCAPMn寄存器)

    1、 设置PCA捕获模块的对外部脉冲的捕获方式:主要是允许上升沿捕获或者下降沿捕获。由CCAPMnCAPPnCAPNn决定:当CAPPn=1,允许上升沿捕获;当CAPNn=1,允许下降沿捕获

    2、 使能CCFn中断。设置相应的ECCFn=1

    具体的工作流程如下,以PCA0为例并设置为上升沿捕获:PCA0模块对P3^7PCA0的输入管脚)进行跳变捕获,当采样到有效的上升沿时,PCA在硬件上会把PCA的计数器寄存器(CH/CL)的值转载到PCA0的捕获寄存器(CCAP0LCCAPOH)中,置位中断标志位:CF =1CCF0=1。使用者则只需要,在中断函数里进行相关的操作即可,记得要清零中断标志位。

    三、IO口初始化函数、PCA初始化函数、PCA中断处理函数

    /*******************************************************************************
    * Function Name  : IO_Init
    * Description    : IO初始化
    * Input          : None
    * Output         : None
    * Return         : None
    * Others         : 系统时钟20Mhz
    *******************************************************************************/
    void IO_Init(void)
    {
    	P3M0 |= 0xA0;//初始化P3^7(PCA0),P3^5(PCA1)的IO状态为:仅为输入,
    	P3M1 |= 0x00;
    	P2M0 |= 0x10;//初始化P2^4(PCA3)的IO状态为:仅为输入
    	P2M1 |= 0x00;
    }
    /*******************************************************************************
    * Function Name  : PCA_Init
    * Description    : PCA初始化
    * Input          : None
    * Output         : None
    * Return         : None
    * Others         : 系统时钟20Mhz
    *******************************************************************************/
    void PCA_Init(void)
    {
    	CMOD |= 0x01;//CMOD=00000011
    			//CIDL=0,空闲模式下允许PCA继续工作
    			//CPS1:CPS0=01,PCA的时钟系统为:sysclk/2
    			//ECF=1,允许寄存器CCON中CF位的中断
    	CCON |= 0x00;//CCON=01000000
       			//CF=0,PCA计数器阵列溢出标志位清零
    			//CR=0,关闭PCA计数器阵列
    			//CCF0-3=0,PCA模块0123中断标志位清零
    	CCAPM0 |= 0x21;//CCAPM0=00100001
    			//ECOM0=0,不允许比较器功能
    			//CAPP0=1,允许上升沿捕获
    			//MAT0=0,PCA计数值与模块的捕获值相匹配时,置位中断CCP0
    			//ECCF0=1,使能CCF0中断
    	CCAPM1 |= 0x21;//CCAPM1=00100001
    			//ECOM1=0,不允许比较器功能
    			//CAPP1=1,允许上升沿捕获
    			//MAT1=0,PCA计数值与模块的捕获值相匹配时,置位中断CCP1
    			//ECCF1=1,使能CCF1中断
    	CCAPM2 |= 0x21;//CCAPM2=00100001
    			//ECOM2=0,不允许比较器功能
    			//CAPP2=1,允许上升沿捕获
    			//MAT2=0,PCA计数值与模块的捕获值相匹配时,置位中断CCP2
    			//ECCF2=1,使能CCF2中断
    	CCAPM3 |= 0x21;//CCAPM3=00100001
    			//ECOM3=0,不允许比较器功能
    			//CAPP3=1,允许上升沿捕获
    			//MAT3=0,PCA计数值与模块的捕获值相匹配时,置位中断CCP3
    			//ECCF3=1,使能CCF3中断
    	CH = 0;//PCA装载值的高8位
    	CL = 0;//PCA装载值的低8位
    	CCAP0L = 0;//PCA0捕获计数值的高8位
    	CCAP0H = 0;//PCA0捕获计数值的低8位
    	CCAP1L = 0;//PCA1捕获计数值的高8位
    	CCAP1H = 0;//PCA1捕获计数值的低8位
    	CCAP2L = 0;//PCA2捕获计数值的高8位
    	CCAP2H = 0;//PCA2捕获计数值的低8位
    	CCAP3L = 0;//PCA3捕获计数值的高8位
    	CCAP3H = 0;//PCA3捕获计数值的低8位
    
    	CR = 1;	   //CR=1,启用PCA计数器阵列
    	IE |= 0x40;//EPCA_LVD=1,允许PCA模块和低压监测中断 
    	EA = 1;	   //EA=1,打开总中断 
    }
    /*******************************************************************************
    * Function Name  : PCA_ISR
    * Description    : PCA扩展中断处理函数
    * Input          : None
    * Output         : None
    * Return         : None
    * Others         : None
    *******************************************************************************/
    void PCA_ISR(void) interrupt 7 using 1
    {
    	EPCA_LVD = 0;//关闭PCA中断
    	if(1 == CF)//有信号就进入捕获中断
    	{
    		CF = 0;	//清零PCA总的捕获中断标志位
    	}
    	if(1 == CCF0)
    	{
    		CCF0 = 0;    //清零PCA0的捕获中断标志位
    		CCF0_Flag++; //CCF0_Flag标志位递增
    	}
    	if(1 == CCF1)
    	{
    		CCF1 = 0;    //清零PCA1的捕获中断标志位
    		CCF1_Flag++; //CCF1_Flag标志位递增
    	}
    	if(1 == CCF2)
    	{
    		CCF2 = 0;    //清零PCA2的捕获中断标志位
    		CCF2_Flag++; //CCF2_Flag标志位递增
    	}
    	if(1 == CCF3)
    	{
    		CCF3 = 0;    //清零PCA3的捕获中断标志位
    		CCF3_Flag++; //CCF3_Flag标志位递增
    	}
    	EPCA_LVD = 1;//打开PCA中断
    }


     

    展开全文
  • STC系列51单片机利用PCA定时器产生PWM信号例程,使用STC系列单片机自带PWM功能
  • PCA是一个模块,是一个硬件结构,具体的如下图所示16位PCA定时器/计数器相当于定时器0/1。每经过一个时钟周期会自动加1,时钟周期来源与下图几部分: 一个时钟周期可能为(SYSclk/1,SYSclk/2...),最后一个外部...
  • 利用stc12c5a60s2内部的PCA模块捕获光电编码器的输出的两路脉冲然后计算脉冲个数及判断转动方向。很好用的程序。
  • 当使用系统时钟分频达不到想要的PWM输出频率时,可以采用通过T0的溢出来设定PWM输出频率,并进行PWM占空比的调节
  • 2,PCA时钟源设置有4种方式,一般都有T0的溢出率,来设置PCA时钟源, 一般在COMD这个寄存器的B2,B1两位来确定是那种方式,10方式就是T0溢出方式(1T更快),可以做可变PCA时钟源时钟源,从而得到可变频率的pwm输出。...
  • 单片机制作0~30V升压模块C51程序: #include <STC12C5410AD>//晶振为18.324Mhz时PWM频率为36Khz #include #define STEP 0x01 //PWM脉宽步进值 #define BD 0xA2 //电阻分压定值 3.165V unsigned char pulse_...
  • 树莓派控制16路PWM输出的PCA9685模块 1.PCA9685 1.1简介 采用I2C通信,内置了PWM驱动器和一个时钟,不需要不断发送信号占用单片机资源 支持16路PWM输出,每路12位分辨率(4096级),在60Hz的更新率能够达到4us分辨率 ...
  • 是用STC15W系列单片机(本例直接可用STC15W401-408AS的MCU)直接测试功能的KEIL4工程。经过PCA输出可控频率可控占空比的PWM波,采用T0溢出方式。
  • C51PCA模块当定时器

    2020-07-14 23:30:45
    STC15 系列部分单片机集成了3路可编程计数器�列(CCP/PC�)模块(STC15W4K32S4系列单 片机只有两路CCP/PC�),可用于软件定时器�外部脉冲的捕捉�高速脉冲输出以及脉宽调制 (PWM)输出
  • T0的时钟输出引脚是在T0CLKO/P3.5。要想在这里输出时钟我们要配置寄存器INT_CLKO(AUXR2),寄存器INT_CLKO如下表:    T0的时钟输出需要设置T0CLKO(B0)位。当其为1时,允许T0定时器对外输出时钟,输出时钟频率 = ...
  • 简介: 此模块共有3个,可用作外部中断,定时器,高速脉冲产生,PWM产生。 CCP英文为:Capture(捕获),Compare(比较),PWM(脉宽调制),总结了此模块的功能。 一.所用寄存器 1.CMOD PCA工作模式寄存器 SFR ...
  • 而我用的主控板只有两路pwm输出,不能满足要求,所以在查阅了相关资料后,找到了PCA9685模块。因为网上对PCA9685模块的介绍很多,这里就不再详细介绍。贴上我认为介绍比较详细的链接: PCA9685模块详细介绍 其中主要...
  • PCA高速输出

    2017-07-29 22:42:00
    #include "STC15W4K.H" // 包含STC15W4K寄存器定义文件 void main() { //初值计算方法为:步长值=计数脉冲频率/(2*所需频率) // (22118400/12)/(2*10000) = 92.16 = 0x005C ... // 给PCA模块0的CCAP0L置初值 10khz CC
  • PCA的PWM

    2017-08-09 20:54:01
    #include "STC15W4K.H" // 包含STC15W4K寄存器定义文件 void main() { //占空比 = (1-CCAPnH/256)*100% //CCAPnH = (1 - 占空比)*256 // (1-0.875)*256 = 32 = 20H ... // 设置PCA模块为PWM输出方式。 CR=1;
  • STC15的PCA/PWM模块和定时器0结合输出频率和占空比都可调的PWM波
  • 一.模拟舵机控制 1.简介 9g模拟舵机在市面上十分常见,价格也比较便宜。可用于航模,机器人或智能小车等。 如上图所示,一个舵机有三条线:VCC、GND和信号线。只要通过信号线给予规定的控制信号即可实现舵机码盘的...
1 2 3 4 5 ... 16
收藏数 303
精华内容 121
关键字:

单片机pca模块