登录|立即注册|使用QQ帐号登录
论坛 > 24小时必答区
发帖|
看3405|回9|收藏
楼主 ID:498757 只看他
2021-7-30 14:18
悬赏 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++);
    };
}


沙发 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 (2021-8-3 11:53 上传)

原图尺寸 27.46 KB, 下载次数: 76

捕获.PNG

51黑电子论坛

Powered by Discuz! X3.1

首页|标准版|触屏版|电脑版