CH554例程用定时器输出PWM波,但引脚没变化?

image.pngimage.png程序是在定时器例程里面改的,现在编译也正常,但就是P34引脚输出没有波形?大佬们这个是什么情况??

定时器中的timer1变量为局部变量,应该是timer++以及相关的if判断工作不正常。

将timer1定义为全局变量。


回来订正一下:局部变量的时候波形输出没有变化,改成全局变量的时候波形输出有变化了


错误信息,不能撤回;希望论坛这边可以添加一个消息撤回选项


/********************************** (C) COPYRIGHT *******************************
* File Name          : Main.C
* Author             : WCH
* Version            : V1.1
* Date               : 2017/09/05
* Description        : CH554 Time ?????????¨?±?÷???????÷??????T2??×???????
                       ?¨?±?÷???????í 
*******************************************************************************/
#include "..\Public\CH554.H"                                                  
#include "..\Public\Debug.H"
#include "Timer.H"
#include "stdio.h"
#include "GPIO.H"

#pragma  NOAREGS

//UINT8 FLAG;
//UINT16 Cap[8] = {0};
int time1=0,time2=0;
sbit PWM_1 = P3^4;
sbit PWM_2 = P1^0;

main( ) 
{
    CfgFsys( );                //CH554?±??????????   
    mDelaymS(50);               //?????÷?????¨?é???????±?????÷?????¨ 	
    mInitSTDIO( );             //??????????
	  Port3Cfg(1,4);             //P34?è?????ì????
		Port1Cfg(1,0);             //P10?è?????ì????
    printf("start ...\n"); 


#ifdef T0_INT
    printf("T0 Test ...\n"); 
//    mTimer0ClkFsys();	         		 //T0?¨?±?÷?±???è??  ?¨?±?÷,?±??=Fsys
	  mTimer0Clk12DivFsys();	         //T0?¨?±?÷?±???è??  ?¨?±?÷,?±??=Fsys/12 T0±ê×??±??
    mTimer_x_ModInit(0,1);           //T0 ?¨?±?÷?????è??  ????1??16???¨?±?÷
    mTimer_x_SetData(0,0xD8FE);	     //T0?¨?±?÷????
    mTimer0RunCTL(1);                //T0?¨?±?÷????	
    ET0 = 1;                         //T0?¨?±?÷????????		
    EA = 1;
    while(1);
#endif	
//#ifdef T1_INT
//    printf("T1 Test ...\n"); 
//    mTimer1Clk12DivFsys();	         //T1?¨?±?÷?±???è??	
//    mTimer_x_ModInit(1,2);           //T1 ?¨?±?÷?????è??   8??×?????×°?¨?±?÷
//    mTimer_x_SetData(1,0xEEEE);	     //T1?¨?±?÷????
//    mTimer1RunCTL(1);                //T1?¨?±?÷????		
//    ET1 = 1;                         //T1?¨?±?÷????????		
//    EA = 1;
//    while(1); 
//#endif	


#ifdef T2_INT
    printf("T2 Test ...\n"); 
    mTimer2Clk12DivFsys();	               //T2?¨?±?÷?±???è??
    mTimer_x_ModInit(2,2);           //T2 ?¨?±?÷?????è??
    mTimer_x_SetData(2,0xD8F0);	     //T2?¨?±?÷????
    mTimer2RunCTL(1);                //T2?¨?±?÷????			
    ET2 = 1;                         //T2?¨?±?÷????????		
    EA = 1;
    while(1); 
#endif

    while(1);
}



#ifdef T0_INT
/*******************************************************************************
* Function Name  : mTimer0Interrupt()
* Description    : CH554?¨?±?????÷0?¨?±?????÷???????í????
*******************************************************************************/
void	mTimer0Interrupt( void ) interrupt INT_NO_TMR0 using 1                //timer0????·??????ò,?????????÷×é1
{                                                                           //·???3?±??TH0????Timer1??????×???
//     mTimer_x_SetData(0,0x0000);                                          //·?×???????·????è??????TH0??TL0???? 
	mTimer_x_SetData(0,0xD8FE);		     //T0?¨?±?÷????  65535-10000
	SCK = ~SCK;
	time1++;
	if(time1>=200)	time1=0;
	if(time1=200)	time2=0;
	if(time2<100)	PWM_2=1;
		else PWM_2=0; 
}
#endif

订正:这个程序没有定义宏,所以定义的引脚用示波器监测的时候显示不出来波形。


错误信息,可能会造成误导,撤回


1、检查T0_INT、T2_INT两个宏是否有效

2、程序中都有保留SCK翻转,用示波器观察P1.7(SCK)是否有翻转

3、不使用定时器功能,直接在主循环中定时翻转两个IO,检查IO本身能否实现翻转


在程序最开始的时候添加了宏定义,这个时候示波器监测到SCK翻转,但IO不翻转;直接在程序里面翻转IO又是没有问题的。



时钟引脚有翻转信号,但定义的输出引脚信号没有翻转;单独翻转定义的输出引脚又可以实现翻转。更换引脚和配置还是一样的效果,只要设置成输出模式都可以(一般设置成推挽输出)。


自己回复自己一下,能输出波形了,但具体不知道是什么问题?

我把程序宏全部去掉,只留下定时器基础设置和中断函数,然后运行可以输出波形。这样看的话应该算是宏定义有误吧!

但程序是能进入中断的,SCK也能翻转但就是没有波形输出。这样来说宏应该是定义成功了的。

所以我也不知道是什么问题,有大佬帮忙给小白解释一下吗?


P34

image.png

icon_rar.gifEXAM.zip



/********************************** (C) COPYRIGHT *******************************
* File Name          : Main.C
* Author             : WCH
* Version            : V1.1
* Date               : 2017/09/05
* Description        : CH554 Time ?????????¨?±?÷???????÷??????T2??×???????
                       ?¨?±?÷???????í 
*******************************************************************************/
#include "..\Public\CH554.H"                                                  
#include "..\Public\Debug.H"
#include "Timer.H"
#include "stdio.h"
#include "GPIO.H"

#pragma  NOAREGS
int time=0;
sbit PWM_1 = P3^4;
UINT16 T0_INIT=0X0056;

main( ) 
{
    CfgFsys( );                //CH554?±??????????   
    mDelaymS(10);              //?????÷?????¨?é???????±?????÷?????¨ 	
    mInitSTDIO( );             //??????????
	  Port3Cfg(1,4);             //P34?è?????ì????
	  UART1Init( );              //????1??????
	
    mTimer0ClkFsys();	         		 //T0?¨?±?÷?±???è??  ?¨?±?÷,?±??=Fsys
//		  mTimer0Clk4DivFsys();					//T0?¨?±?÷?±???è??  ?¨?±?÷,?±??=Fsys/4
//		mTimer0Clk12DivFsys();         //?¨?±?÷,?±??=Fsys/12 T0±ê×??±??
    mTimer_x_ModInit(0,1);         //T0 ?¨?±?÷?????è??  ????1??16???¨?±?÷
//	  mTimer_x_ModInit(0,2);         //T0 ?¨?±?÷?????è??  ????2??8??×?????×°?????¨?±?÷
    mTimer_x_SetData(0,T0_INIT);	   //T0?¨?±?÷????
	
	  mTimer0RunCTL(1);              //T0?¨?±?÷????	
    ET0 = 1;                       //T0?¨?±?÷????????		
    EA = 1;		
    while(1)	{}
}
/*******************************************************************************
* Function Name  : mTimer0Interrupt()
* Description    : CH554?¨?±?????÷0?¨?±?????÷???????í????
*******************************************************************************/
void	mTimer0Interrupt( void ) interrupt INT_NO_TMR0 using 1                //timer0????·??????ò,?????????÷×é1
{                                                                           //·???3?±??TH0????Timer1??????×???
	mTimer_x_SetData(0,T0_INIT);		     //T0?¨?±?÷????
	SCK = ~SCK;
	time++;
	if(time>=2)	time=0;
	if(time<1)	PWM_1=1;
		else PWM_1=0;                                          
}

现在可以输出43K左右的波形,但继续调小T0_INIT(定时器初始值),波形变化有点奇怪,继续减小初始值频率会变大,但达到一定程度后初始值不管如何变化频率基本保持不变。这是个什么情况?



我发现定时器时钟=Fsys和定时器时钟=Fsys/12两种情况下输出的频率并非是12倍的关系(输出PWM频率在43K左右),当选择四倍频输出的时候程序报错,4倍频没测。我想输出频率在43K、占空比可调的PWM波,这个芯片能做到吗?现在能输出43K但占空比不能调整,大佬可以帮忙看看吗?



您好,使用定时器时要注意是否和串口初始化时使用的定时器冲突。比如T2MOD寄存器。


这个应该是没有关系的,我前面也考虑是否会有影响,我把串口初始化那些都注释掉了,输出还是大概到50K的时候频率就不变化了,我监测的是SCK时钟引脚。


现在的情况是,定时器给初值0x0056时钟引脚SCK可以输出43K左右的波形,当把初始值改为0x002B的时候输出就是50K,按照理论来说应该是86K左右才是正常的,但现在好像到50K就达上限了


只有登录才能回复,可以选择微信账号登录