找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求助 89C52控制步进电机,摇杆可调速

[复制链接]
跳转到指定楼层
#
ID:457693 发表于 2020-4-15 10:17 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
20黑币
各位大神,小弟想用单轴摇杆(0-5V模拟量输出)控制步进电机的方向和转速,请问如何实现,以下是我的程序,但用Proteus仿真发现:
1.脉冲的输出和摇杆的变化不对应。
2.脉冲波形中间会规律的出现一段较长时间的低电平或高电平。
希望各位大神指点!感谢!
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
/*ADC0809将摇杆模拟信号转换为数字信号*/
sbit ST=P0^0;             //P0ADC0809信号控制口
sbit EOC=P0^1;
sbit OE=P0^2;
sbit CLK=P0^3;
sbit shineng=P2^0;           //      步进电机驱动
sbit fangxiang=P2^1;
sbit zhuan=P2^2;
uchar num;
uchar pwm;                                  //控制脉冲频率
uchar u_cai;            //信号采集
void timestart()        //ADC0809模块初始化
{
         TMOD=0x01;
         TH1=(65536-1)/256;
         TL1=(65536-1)%256;
         TH0=(65536-10000)/256;
         TL0=(65536-10000)%256;

         ET0=1;
         EA=1;
         ET1=1;
         TR1=1;

}

void delay(uint xms)          //延时函数
{
         uinti,j;
         for(i=xms;i>0;i--)
                   for(j=110;j>0;j--);
}

void jisuan(uchar u_cai)     //通过采集的模拟信号计算脉冲周期
{
         if(u_cai<=125)
         {
                   fangxiang=1;
                   pwm=u_cai+1;
         }
         elseif((u_cai>125)&&(u_cai<=135))
         {
                   pwm=255;
                   shineng=0;
         }
         else
         {        
                   fangxiang=0;
                   pwm=-1*(u_cai-129)+126;
         }
}

}
void caishu()          //ADC0809信号采集程序
{

            ST=0;
            ST=1;
            ST=0;
            OE=1;
            delay(8);
            u_cai=P1;
            OE=0;

}

void main()
{
         timestart();      
         shineng=1;

         while(1)
         {
                   num=0;
                   caishu();
                   jisuan(u_cai);
                   TR0=1;
         }

}

void time1() interrupt 3
{
         TH1=(65536-1)/256;
         TL1=(65536-1)%256;
         CLK=~CLK;
}

void time0() interrupt 1
{
         TH0=(65536-100)/256;
         TL0=(65536-100)%256;

         num++;
         if(num==pwm)
         {
                   num=0;
                   zhuan=~zhuan;

         }
}

摇杆步进电机.zip

18.91 KB, 下载次数: 15

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

使用道具 举报

沙发
ID:457693 发表于 2020-4-15 14:27 | 只看该作者
wwl0098 发表于 2020-4-15 13:31
void time0() interrupt 1
{
         TH0=(65536-100)/256;

谢谢,那请问遥控车的摇杆调速都是怎么实现的呢?
另外我模拟了一下,发现脉冲频率和模拟量的对应关系会有问题,没有规律。
回复

使用道具 举报

楼主
ID:233099 发表于 2020-4-15 13:31 | 只看该作者
void time0() interrupt 1
{
         TH0=(65536-100)/256;
         TL0=(65536-100)%256;

         num++;
         if(num==pwm)
         {
                   num=0;
                   zhuan=~zhuan;

         }
}
========================
假如当前num=10;pwm=20;
pwm发生变化,pwm=2;
那么要等num溢出之后才会满足if()的条件
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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