OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5251|回复: 10

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

[复制链接]

8

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2017-7-19
在线时间
87 小时
发表于 2021-7-30 09:21:13 | 显示全部楼层 |阅读模式
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;

   

         

}
void jianshu()
{   

      
}

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

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

912

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4508
金钱
4508
注册时间
2019-9-4
在线时间
914 小时
发表于 2021-7-30 10:45:11 | 显示全部楼层
51单片机好久没玩了,无非就是修改定时器的值
回复

使用道具 举报

8

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2017-7-19
在线时间
87 小时
 楼主| 发表于 2021-7-30 11:35:42 | 显示全部楼层
A571157242 发表于 2021-7-30 10:45
51单片机好久没玩了,无非就是修改定时器的值

我也知道 是改定时器的值,就不知道怎么改法,要是用stm32做就太浪费了,
回复

使用道具 举报

4

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2020-8-5
在线时间
31 小时
发表于 2021-7-30 14:59:10 | 显示全部楼层
比如设置1ms标记,500us 标记,250us标记,初值设为50us,进1ms1000次后即1S后,次数清零,1ms标记清零,进入500us并设标记,进入2000次后,次数清零,标记清零,最后进入250us
回复

使用道具 举报

8

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2017-7-19
在线时间
87 小时
 楼主| 发表于 2021-7-30 15:08:54 | 显示全部楼层
DackeY 发表于 2021-7-30 14:59
比如设置1ms标记,500us 标记,250us标记,初值设为50us,进1ms1000次后即1S后,次数清零,1ms标记清零,进 ...

我师傅做的是 定时器加1    TH0=(65536-num)/256;  num就减1   初始值90  减到80就等于80
回复

使用道具 举报

4

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2020-8-5
在线时间
31 小时
发表于 2021-7-30 16:38:25 | 显示全部楼层
tianxiazone 发表于 2021-7-30 15:08
我师傅做的是 定时器加1    TH0=(65536-num)/256;  num就减1   初始值90  减到80就等于80

那你还有什么问题。。方法不是有了吗
回复

使用道具 举报

8

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2017-7-19
在线时间
87 小时
 楼主| 发表于 2021-7-30 17:20:55 | 显示全部楼层
DackeY 发表于 2021-7-30 16:38
那你还有什么问题。。方法不是有了吗

方法有了程序写不出来,写出来的程序,跟设想的不一样。
回复

使用道具 举报

8

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2017-7-19
在线时间
87 小时
 楼主| 发表于 2021-8-3 11:53:08 | 显示全部楼层
步进电机波形图,但是步进电机转速还是上不去,速度很慢有500转,频率给高了就嗡嗡响,不转。
捕获.PNG
回复

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3348
金钱
3348
注册时间
2013-5-28
在线时间
468 小时
发表于 2021-8-3 16:41:46 | 显示全部楼层
步进电机应该是要修改PWM的周期吧.
至于你说的给高了不转,明显就是失步造成的震颤,适当降低提升速度啊,
要么想办法找个反馈,就是能同步下时间的反馈
回复

使用道具 举报

8

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2017-7-19
在线时间
87 小时
 楼主| 发表于 2021-8-3 17:33:36 | 显示全部楼层
聚东风 发表于 2021-8-3 16:41
步进电机应该是要修改PWM的周期吧.
至于你说的给高了不转,明显就是失步造成的震颤,适当降低提升速度啊,
...

不是的我用的是 步进电机的电路模块,用的电路模块不是直接驱动的电机,降低频率是可以驱动电机的,但是转速不高,电机的频率时间只能是在20us,小于20us就失步。
1b9a457a0a1f38346e2011ff935951e.jpg
回复

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3348
金钱
3348
注册时间
2013-5-28
在线时间
468 小时
发表于 2021-8-4 08:27:51 | 显示全部楼层
那就想办法找同步点啊
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-26 02:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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