找回密码
 立即注册
查看: 714|回复: 15

5616AD如何精确产生1us的计时

[复制链接]

19

主题

46

回帖

210

积分

中级会员

积分
210
发表于 2024-9-4 09:23:35 | 显示全部楼层 |阅读模式
各位好:

有个问题想请教一下.
我现在需要产生一个频率为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; //打开定时器
}

回复

使用道具 举报 送花

19

主题

46

回帖

210

积分

中级会员

积分
210
发表于 2024-9-4 09:26:57 | 显示全部楼层
这是示波器观察到的波形,周期去到912us
截图202409040926217614.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:425
  • 最近打卡:2025-05-03 00:09:43
已绑定手机

77

主题

4850

回帖

8388

积分

超级版主

DebugLab

积分
8388
发表于 2024-9-4 09:41:42 | 显示全部楼层
频率太高了,中断频率要1M,中断函数内的程序会占用大量时间
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:294
  • 最近打卡:2025-03-06 09:25:41

8

主题

318

回帖

1835

积分

金牌会员

积分
1835
发表于 2024-9-4 10:00:12 | 显示全部楼层
STC12C5616AD有PCA/PWM模块
可以用定时器的1us溢出来作时钟源
那就不用频繁进出中断
  1. /*------------------------------------------------------------------*/
  2. /* --- STC MCU Limited ---------------------------------------------*/
  3. /* --- STC12C56xx Series MCU PCA module output PWM wave Demo -------*/
  4. /* --- Mobile: (86)13922805190 -------------------------------------*/
  5. /* --- Fax: 86-0513-55012956,55012947,55012969 ---------------------*/
  6. /* --- Tel: 86-0513-55012928,55012929,55012966----------------------*/
  7. /* --- Web: www.STCMCU.com -----------------------------------------*/
  8. /* --- Web: www.GXWMCU.com -----------------------------------------*/
  9. /* If you want to use the program or the program referenced in the  */
  10. /* article, please specify in which data and procedures from STC    */
  11. /*------------------------------------------------------------------*/
  12. #include <STC12C5630AD.H>
  13. #include "intrins.h"
  14. #define FOSC    11059200L
  15. typedef unsigned char BYTE;
  16. typedef unsigned int WORD;
  17. void Timer0_Init(void)                //1微秒@12.000MHz
  18. {
  19.         AUXR |= 0x80;                        //定时器时钟1T模式
  20.         TMOD &= 0xF0;                        //设置定时器模式
  21.         TMOD |= 0x02;                        //设置定时器模式
  22.         TL0 = 0xF4;                                //设置定时初始值
  23.         TH0 = 0xF4;                                //设置定时重载值
  24.         TF0 = 0;                                //清除TF0标志
  25.         TR0 = 1;                                //定时器0开始计时
  26. }
  27. void main()
  28. {
  29.         Timer0_Init();
  30.     CCON = 0;                       //Initial PCA control register
  31.                                     //PCA timer stop running
  32.                                     //Clear CF flag
  33.                                     //Clear all module interrupt flag
  34.     CL = 0;                         //Reset PCA base timer
  35.     CH = 0;
  36.     CMOD = 0x04;                    //Set PCA timer clock source as Timer0 overflow
  37.                                     //Disable PCA timer overflow interrupt
  38.     CCAP0H = CCAP0L = 0x80;         //PWM0 port output 50% duty cycle square wave
  39.     CCAPM0 = 0x42;                  //PCA module-0 work in 8-bit PWM mode and no PCA interrupt
  40.     CCAP1H = CCAP1L = 0xff;         //PWM1 port output 0% duty cycle square wave
  41.     PCA_PWM1 = 0x03;
  42.     CCAPM1 = 0x42;                  //PCA module-1 work in 8-bit PWM mode and no PCA interrupt
  43.     CR = 1;                         //PCA timer start run
  44.     while (1);
  45. }
复制代码
回复 支持 反对

使用道具 举报 送花

19

主题

46

回帖

210

积分

中级会员

积分
210
发表于 2024-9-4 10:04:33 | 显示全部楼层
那我如何产生频率为10K的PWM信号呢?
回复 支持 反对

使用道具 举报 送花

19

主题

46

回帖

210

积分

中级会员

积分
210
发表于 2024-9-4 10:09:23 | 显示全部楼层
好的,非常感谢.我先试试看
回复 支持 反对

使用道具 举报 送花

19

主题

46

回帖

210

积分

中级会员

积分
210
发表于 2024-9-4 10:14:50 | 显示全部楼层
看的不是很懂,请问是从哪个引脚引出PWM信号?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:294
  • 最近打卡:2025-03-06 09:25:41

8

主题

318

回帖

1835

积分

金牌会员

积分
1835
发表于 2024-9-4 10:59:35 | 显示全部楼层
本帖最后由 Lkck8210 于 2024-9-4 11:01 编辑
liuyu*** 发表于 2024-9-4 10:14
看的不是很懂,请问是从哪个引脚引出PWM信号?

2024-09-04_110024.png

PWM0:P37
PWM1:P35
回复 支持 反对

使用道具 举报 送花

19

主题

46

回帖

210

积分

中级会员

积分
210
发表于 2024-9-4 11:10:23 | 显示全部楼层
好的,非常感谢!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:294
  • 最近打卡:2025-03-06 09:25:41

8

主题

318

回帖

1835

积分

金牌会员

积分
1835
发表于 2024-9-4 14:19:54 | 显示全部楼层
liuyu*** 发表于 2024-9-4 10:04
那我如何产生频率为10K的PWM信号呢?

如果要10kPWM
12MHz 1T定时器的重装值就是
256 - (12000000/2560000) = 256 - 4 = 252 = 0xFC
即 12M/4/256 = 11.718kHz
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-3 15:11 , Processed in 0.199014 second(s), 107 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表