找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3397|回复: 9
打印 上一主题 下一主题
收起左侧

51单片机怎么用定时器输出方波从宽到窄?

[复制链接]
跳转到指定楼层
楼主
5黑币
51单片机 怎么用定时器输出方波从宽到窄,单片机用定时器输出,不借助按键调速。  用来控制步进电机转速,给定高速脉冲时无法启动,必须有一个加速的过程。

单片机源程序如下:
#include<reg52.h>

//宏定义
//***************************************************************
#define uchar unsigned char
#define uint unsigned int
#define TERM 10//周期为10
//***************************************************************

//管脚定义
//***************************************************************



sbit ZHENGKEY = P2^4;//正转

sbit KUAIZHENGKEY = P2^5;//快正转

sbit FANKEY = P2^6; //反转

sbit DIR = P0^1; //方向
sbit EN = P0^2;  //使能
sbit CP = P0^3; // 脉冲

//***************************************************************

//变量定义
//***************************************************************


//***************************************************************





//函数定义
//***************************************************************
void sysinit(void);//初始化
void delayms(unsigned int Num);//延时函数
void T0_time(void);


//***************************************************************

//主函数
//***************************************************************
void main()
{
    static bit temp;
    ZHENGKEY = 1;
    FANKEY = 1;

    sysinit();
    temp = 0;
    CP = 1;

     while(1)
    {   
        jianshu();
        
        if (ZHENGKEY == 0) //正转
        {
            delayms(10);
            if (ZHENGKEY == 0)
            {
                EN = 1;
              TR0=1;
                DIR = 1;
            }
               
        }
      else if (KUAIZHENGKEY == 0)    //快正转
        {
            delayms(10);
            if (KUAIZHENGKEY == 0)
            {
                EN = 1;
                TR0=1;
                DIR = 1;               
            }
        }        
        else if (FANKEY == 0)    //反转
        {
            delayms(10);
            if (FANKEY == 0)
            {
                EN = 1;
                TR0=1;
                DIR = 02;
            }
        }
        else
            {
             EN = 0;
             TR0=0;
            }
    }
}

void sysinit(void)
{
    TMOD = 0x02;
  TH0=(65536-80)/256;         
    TL0=(65536-80)%256;

    EA=1;
    ET0=1;
    TR0=0;   
}
void T0_time()interrupt 1
{   

    TH0=(65536-80)/256;         
    TL0=(65536-80)%256;
    CP=~CP;
   

         

}
void jianshu()
{   

      
}

void delayms(unsigned int Num)
{
    unsigned int i,j;
    for(i=0;i<Num;i++)
    {
     for(j=0;j<300;j++);
    };
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:161164 发表于 2021-7-30 17:05 | 只看该作者
1. 确定脉冲是高电平有效还是低电平(先假设高电平有效)

2. 确定脉冲的最少有效时间(先假设80us)
PWM_H = 65536 - 80;(倒数80us)
PWM_L = 0;(倒数65536us)

3. 把定时器设为16位不自动重装
TMOD = 0x01;

4. 确定时器中断中建立反相程序
void T0_time()interrupt 1
{   
    CP=Swap;
if(Swap)//bit Swap 反相用
{
    TH0=PWM_H /256;         
    TL0=PWM_H %256;
}else
{
    TH0=PWM_L /256;         
    TL0=PWM_L %256;
}
   Swap = !Swap;   
}

5. 在main()中慢慢增加PWM_L 的值

回复

使用道具 举报

板凳
ID:332444 发表于 2021-7-30 17:08 | 只看该作者
回复

使用道具 举报

地板
ID:955239 发表于 2021-7-31 12:00 | 只看该作者
脉宽调制
回复

使用道具 举报

5#
ID:950946 发表于 2021-8-2 11:39 | 只看该作者
给中断啊,定时中断然后改变占空比就可以了。
回复

使用道具 举报

6#
ID:944091 发表于 2021-8-3 09:26 来自手机 | 只看该作者
他这个用pwm应该不行,应该是控制一个频率在一定时间内由低到高或者是由高到低的一个过程。步进电机都必须这样控制才不会失步
回复

使用道具 举报

7#
ID:498757 发表于 2021-8-3 11:30 | 只看该作者
dwb123 发表于 2021-8-2 11:39
给中断啊,定时中断然后改变占空比就可以了。

应该不是改占空比,改的是频率
回复

使用道具 举报

8#
ID:498757 发表于 2021-8-3 11:31 | 只看该作者
chenchuanke 发表于 2021-8-3 09:26
他这个用pwm应该不行,应该是控制一个频率在一定时间内由低到高或者是由高到低的一个过程。步进电机都必须 ...

对的
回复

使用道具 举报

9#
ID:498757 发表于 2021-8-3 11:43 | 只看该作者
波形应该是这样的,但是步进电机转速还是上不去,频率给高了,就嗡嗡响不转。
回复

使用道具 举报

10#
ID:498757 发表于 2021-8-3 11:54 | 只看该作者
步进电机波形图,但是步进电机转速还是上不去,速度很慢有500转,频率给高了就嗡嗡响,不转。

捕获.PNG (27.46 KB, 下载次数: 76)

捕获.PNG
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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