找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2199|回复: 6
收起左侧

51单片机采集风向信息并通过风向信息控制步进电机问题

[复制链接]
ID:222455 发表于 2017-8-24 15:39 | 显示全部楼层 |阅读模式
本帖最后由 zolch 于 2017-8-24 15:43 编辑

通过51单片机接风向传感器采集风向信息,再将所采集的风向信息显示在1602上,并利用单片机将采集到的风向信息控制步进电机的转动,比如风向角度值(1-360度),风向增加1度,51控制步进电机转动1度。现所写的风向驱动步进电机程序如下,编译没有问题,接到实物上电机不转,能感受到里面震动。现在不知道问题出在哪里,希望有大神来帮忙看下!
void main()
{
        uchar adval;
        uint WD;
        uint bai,shi,ge,F1,F2,F3,F4;
        init();
        wela=1;
        P0=0x7f;
        wela=0;
        while(1)
        {
                adwr=1;
                _nop_();
                adwr=0;           //启动ad转换
                _nop_();
                adwr=1;
                delayms(1000);
                P1=0xff;   //读取P1口之前先给其写全1  
                adrd=1;                  //选通AD0804 CS 端
                _nop_();
                adrd=0;                 //A/D读使能
                _nop_();
                adval=P1;        //A/D数据读取赋给P1口
                adrd=1;
                WD=adval;
                WD=WD*72/51;                                                //获得当前时刻的风向值
                        g=WD;                                                        //将当前时刻的风向值赋给g
        {       
                if(WD>g)                                                         //判断下一时刻的风向值大于g
                {  h=WD;                                                         //将下一时刻的风向值赋给h
   {        for(l=0;l<(h-g);l++)                                  //循环h-g次
            for(l=1;l>0;l--)                                  //步进电机旋转角度
              {
                         for (t=0; t<8; t++)      
                  {
                                  P1 = FFW1[t]&0x1f;  
                                  delay(1)   ;                              
                          }
              }
   }
        }
                else if(WD<g)
                { h=WD;
        {                for(l=0;l<(h-g);l++)
                                                  
                                 for(l=1;l>0;l--)
                         {
                                           for (t=0; t<8; t++)      
                                        {
                                                   P1 = FFZ1[t]&0x1f;
                                                          delay(1);
                                                }
                         }
        }
           }
                else
                {;}
        }
                bai=(int)WD/100;
                shi=(int)WD%100/10;
                ge=(int)WD%10;      //(int)字符型强制转换成整形  1602分出 个位跟小数点后四位   
                F1=(int)(WD*10)%10;   
                F2=(int)(WD*100)%10;   
                F3=(int)(WD*1000)%10;   
                F4=(int)(WD*10000)%10;   
                lcd_display(bai,shi,ge,F1,F2);
        }
回复

使用道具 举报

ID:82765 发表于 2017-8-24 15:59 来自手机 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

ID:123289 发表于 2017-8-24 16:22 | 显示全部楼层
先去除程序中采样、显示……,只留下电机驱动部分,看看电机能不能转。设法让电机先转起来。
回复

使用道具 举报

ID:222455 发表于 2017-8-24 17:03 来自手机 | 显示全部楼层
yzwzfyz 发表于 2017-8-24 16:22
先去除程序中采样、显示……,只留下电机驱动部分,看看电机能不能转。设法让电机先转起来。

之前利用按键控制电机转,证明了电机部分的程序应该没啥问题,后来加了最上面一层for循环来利用风向控制电机转,结果有问题
回复

使用道具 举报

ID:222455 发表于 2017-8-24 17:06 来自手机 | 显示全部楼层
cjjcjj1 发表于 2017-8-24 15:59
你好,你的步进电机是怎么接的,把图发一下

连接如图
IMG_2353.JPG
回复

使用道具 举报

ID:228347 发表于 2017-8-24 22:22 | 显示全部楼层
最好把h值当成一个上一时刻的值,然后你现在读到的g为当前值。g!=h,时去转动你的电机,完成之后将g的值赋值给h。之前写的语句是有错的,你刚把g=WD,又去判断g大于或者小于WD,这样合适吗。。。?

g=WD;                                                        //将当前时刻的风向值赋给g
        {        
                if(WD>g)                                                         //判断下一时刻的风向值大于g
回复

使用道具 举报

ID:222455 发表于 2017-9-19 09:34 | 显示全部楼层
oo0o_11 发表于 2017-8-24 22:22
最好把h值当成一个上一时刻的值,然后你现在读到的g为当前值。g!=h,时去转动你的电机,完成之后将g的值赋 ...

我也想过这个问题,不过在程序中怎么利用两个时刻的值进行比较啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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