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

image.png我可以在系统时钟分频选择那里自己设置2分频或1分频吗?如果可以该怎么设置呢?


#include "..\Public\CH554.H"                                                  
#include "..\Public\Debug.H"
#include "Timer.H"
#include "stdio.h"
#include "GPIO.H"

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

main( ) 
{
    CfgFsys( );                /
    mDelaymS(10);              
//  mInitSTDIO( );            
    Port3Cfg(1,4);            
	
    mTimer0ClkFsys();	         		
//    mTimer0Clk4DivFsys();					
//    mTimer0Clk12DivFsys();        
    mTimer_x_ModInit(0,1);       
//    mTimer_x_ModInit(0,2);     
    mTimer_x_SetData(0,T0_INIT);	
	
    mTimer0RunCTL(1);            	
    ET0 = 1;                      	
    EA = 1;		
    while(1)	{}
}

void	mTimer0Interrupt( void ) interrupt INT_NO_TMR0 using 1                
{                                                                           
	mTimer_x_SetData(0,T0_INIT);		    
	SCK = ~SCK;
	time++;
	if(time>=4)	time=0;
	if(time<2)	PWM_1=1;
        	else PWM_1=0;                                          
}

现在的程序,希望不改变中断函数里面的值通过定时器实现输出86K左右的波形


您好。您可以参考一下这个PWM输出94K可调占空比的程序。

icon_rar.gifEVT.zip



这个程序我看过的,这个是直接把系统时钟除以256就得出PWM的频率,占空比就是调整256里面高电平所占的数值长度。

我觉得这个和定时器输出PWM参考性不大,现在我遇到的问题感觉像是定时器定时进入中断的时间刻度太短的话进入中断有误


/********************************** (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
sbit PWM_1 = P3^4;
UINT16 T0_INIT=0X0042;
int time=0;

main( ) 
{
    CfgFsys( );                //CH554时钟选择配置   
    mDelaymS(10);              //修改主频,建议稍加延时等待主频稳定 	
    mInitSTDIO( );             //串口初始化
	  Port3Cfg(1,4);             //P34设置推挽模式
	
    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>=4)	time=0;
	if(time<2)	PWM_1=1;
		else PWM_1=0;                                          
}

测了一下,当初值给到比0x0042(66)还小时输出的频率就不再怎么变化(大约50K)这个情况就很诡异。我是按照官网下载例程配置的,大佬们,可以帮忙看看哪里配置错了吗?


您好,定时器0八位重载模式输出100K左右方波您参考一下。

icon_rar.gifEVT.zip

后续问题可以电话咨询:025-52635387或发邮箱至dxy@wch.cn


现在能输出高频率的PWM波了,问题是板子上的晶振用的是12M的,换成24M的就能实现要求了。

但现在我还有一个疑惑,理论来说定时器的初值(进入中断的计数值)减少一半输出频率会增加一倍,但实际情况是只有在初值(进入中断的计数值)很大(初值1000+)的时候才能有接近两倍的关系,在初值(进入中断的计数值)小于100的时候再减半频率就基本保持不变了,这个是为什么呢?


谢谢厂家技术人员的细致指导


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