liuyu8087 发表于 2024-9-4 09:23:35

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; //打开定时器
}

liuyu8087 发表于 2024-9-4 09:26:57

这是示波器观察到的波形,周期去到912us

DebugLab 发表于 2024-9-4 09:41:42

频率太高了,中断频率要1M,中断函数内的程序会占用大量时间

Lkck8210 发表于 2024-9-4 10:00:12

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);
}

liuyu8087 发表于 2024-9-4 10:04:33

那我如何产生频率为10K的PWM信号呢?

liuyu8087 发表于 2024-9-4 10:09:23

好的,非常感谢.我先试试看

liuyu8087 发表于 2024-9-4 10:14:50

看的不是很懂,请问是从哪个引脚引出PWM信号?

Lkck8210 发表于 2024-9-4 10:59:35

本帖最后由 Lkck8210 于 2024-9-4 11:01 编辑

liuyu8087 发表于 2024-9-4 10:14
看的不是很懂,请问是从哪个引脚引出PWM信号?


PWM0:P37
PWM1:P35

liuyu8087 发表于 2024-9-4 11:10:23

好的,非常感谢!

Lkck8210 发表于 2024-9-4 14:19:54

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
查看完整版本: 5616AD如何精确产生1us的计时