我可以在系统时钟分频选择那里自己设置2分频或1分频吗?如果可以该怎么设置呢?
查看: 6317
回复: 23
CH554例程用定时器输出PWM波,但引脚没变化?
#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左右的波形
这个程序我看过的,这个是直接把系统时钟除以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)这个情况就很诡异。我是按照官网下载例程配置的,大佬们,可以帮忙看看哪里配置错了吗?
现在能输出高频率的PWM波了,问题是板子上的晶振用的是12M的,换成24M的就能实现要求了。
但现在我还有一个疑惑,理论来说定时器的初值(进入中断的计数值)减少一半输出频率会增加一倍,但实际情况是只有在初值(进入中断的计数值)很大(初值1000+)的时候才能有接近两倍的关系,在初值(进入中断的计数值)小于100的时候再减半频率就基本保持不变了,这个是为什么呢?
谢谢厂家技术人员的细致指导
请勿发布广告和违法内容, 代码可以选择编辑器代码语言格式, 更易他人阅读帮助您, 或者留下联系方式,以便更好更快服务您
只有登录才能回复,可以选择微信账号登录