5616AD如何精确产生1us的计时
各位好:有个问题想请教一下.
我现在需要产生一个频率为10K,占空比可调的PWM信号.
我的想法是用计时器1产生一个1us的精确计时,每1us有个计时变量就加1,加到100了就清0重来.
如计时变量<50时是高电平,>=50时就是低电平,这样就可以产生一个频率为10k(周期100us),占空比50%的PWM信号.
但实际操作时却发现实际输出的PWM信号周期远大于预期(实际周期可达900us).
以下是我的实际代码,请各位指点一下有没有问题.非常感谢!
void main(){
Timer1Init();
P17=0;
while(1){
if(iPwm<50)
P17=1;
else if(iPwm<100)
P17=0;
else
iPwm=0;
}
}
void Timer1() interrupt 3 {
TH1=0xff;
TL1=0xf8;
iPwm++;
}
void Timer1Init(){
AUXR &= 0xBF; //定时器时钟12T模式
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x10; //设置定时器模式
TL1 = 0xFF; //设置定时初值
TH1 = 0xFF; //设置定时初值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
EA=1;//打开总中断
ET1=1; //打开定时器1中断允许
//TR1=1; //打开定时器
}
这是示波器观察到的波形,周期去到912us
频率太高了,中断频率要1M,中断函数内的程序会占用大量时间 STC12C5616AD有PCA/PWM模块
可以用定时器的1us溢出来作时钟源
那就不用频繁进出中断
/*------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------------------------------------*/
/* --- STC12C56xx Series MCU PCA module output PWM wave Demo -------*/
/* --- Mobile: (86)13922805190 -------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ---------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966----------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------*/
/* --- Web: www.GXWMCU.com -----------------------------------------*/
/* If you want to use the program or the program referenced in the*/
/* article, please specify in which data and procedures from STC */
/*------------------------------------------------------------------*/
#include <STC12C5630AD.H>
#include "intrins.h"
#define FOSC 11059200L
typedef unsigned char BYTE;
typedef unsigned int WORD;
void Timer0_Init(void) //1微秒@12.000MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x02; //设置定时器模式
TL0 = 0xF4; //设置定时初始值
TH0 = 0xF4; //设置定时重载值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
void main()
{
Timer0_Init();
CCON = 0; //Initial PCA control register
//PCA timer stop running
//Clear CF flag
//Clear all module interrupt flag
CL = 0; //Reset PCA base timer
CH = 0;
CMOD = 0x04; //Set PCA timer clock source as Timer0 overflow
//Disable PCA timer overflow interrupt
CCAP0H = CCAP0L = 0x80; //PWM0 port output 50% duty cycle square wave
CCAPM0 = 0x42; //PCA module-0 work in 8-bit PWM mode and no PCA interrupt
CCAP1H = CCAP1L = 0xff; //PWM1 port output 0% duty cycle square wave
PCA_PWM1 = 0x03;
CCAPM1 = 0x42; //PCA module-1 work in 8-bit PWM mode and no PCA interrupt
CR = 1; //PCA timer start run
while (1);
}
那我如何产生频率为10K的PWM信号呢?
好的,非常感谢.我先试试看
看的不是很懂,请问是从哪个引脚引出PWM信号? 本帖最后由 Lkck8210 于 2024-9-4 11:01 编辑
liuyu8087 发表于 2024-9-4 10:14
看的不是很懂,请问是从哪个引脚引出PWM信号?
PWM0:P37
PWM1:P35
好的,非常感谢!
liuyu8087 发表于 2024-9-4 10:04
那我如何产生频率为10K的PWM信号呢?
如果要10kPWM
12MHz 1T定时器的重装值就是
256 - (12000000/2560000) = 256 - 4 = 252 = 0xFC
即 12M/4/256 = 11.718kHz
页:
[1]
2