找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

大佬,萌新求指导,暑假刚学单片机,编程总是达不到想要的效果

查看数: 3203 | 评论数: 7 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2020-8-26 15:47

正文摘要:

我和学长自己做的一个小玩意,风控自动窗帘,使用微压传感器,但是我们的程序怎么调就是不能自动控制,我们是这样设置的,信号输入范围3-5v电机run,1-2v电机frun,但是电机却一直在转,如果要实现这样的效果,应该 ...

回复

ID:750684 发表于 2020-9-7 08:17
程序有点混乱,但是像这样的为控制,大多是需要算法来进行调整的,譬如PID算法

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

ID:808485 发表于 2020-8-31 15:48
本帖最后由 gbchang 于 2020-8-31 15:53 编辑

“信号输入范围3-5v电机run,1-2v电机frun,但是电机却一直在转”

我大胆猜测补充一下逻辑要求:
传感器3~5V时,电机正转,1~2V时,电机反转,传感器其它数值时,电机停止
进一步猜测应用场景:
根据风压控制窗帘开闭,起大风时,为了防止刮坏窗帘,打开窗帘(只需要开一次就好),风小了太阳出来了,关窗帘防晒,同样也只需要关一次
所以,开和闭应该是有一个制约关系的。开-关-开-关...,交替进行

在充分尊重原作者程序思想前提下,主程序逻辑增加制约条件,即交替因素:

void Text_Init()
{
        if (disp[0]>=3 && disp[0] != text)
        {//风压变化,且大于3V
                text = disp[0];
                flag = 1;        //请求开窗帘
        }
}
void Text_Init1()
{
        if (disp[0]<=2 && disp[0] != text)
        {//风压变化,且小于2V
                text = disp[0];
                flag = 0;        //请求闭窗帘
        }
}

void main()
{   
    while(1)
    {
        
        datapros();     //数据处理函数
        DigDisplay();
        Text_Init();
        Text_Init1();
               
                if( flag1 == 0 && flag == 1 )
                {//窗帘处于闭合状态,有开启请求
                        run();
                        flag1 = 1;        //窗帘已经打开,记录状态为1
                }
                else if( flag1 == 1 && flag == 0 )
                {//窗帘处于开启状态,有闭合请求
                        frun();
                        flag1 = 0;        //窗帘已经闭合,记录状态为0
                }
    }        
}


评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

ID:781556 发表于 2020-8-27 00:21
if語法應該沒什麼可說的,
關鍵是先確定傳感器的穩定性,漂移誤差範圍,
而後考慮是否可通過算法進行補償修正。
建議逐步監視跟踪數據,以便鎖定問題所在,代碼 電路 器件都有可能。
A.驗證代碼建議移除傳感器,以固定信號進行觸發
B.驗證傳感器建議參考供應商範例。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

ID:391114 发表于 2020-8-26 22:57
程序有点混乱,但是像这样的为控制,大多是需要算法来进行调整的,譬如PID算法
ID:805016 发表于 2020-8-26 20:05
wulin 发表于 2020-8-26 18:11
从楼主混乱不堪的代码猜测:temp = Read_AD_Data(0xE4);获取传感器16位数据,解析temp后得到的信息来控制电 ...

大佬,萌新第一次写代码,很多地方都不太懂,我想请教一下您,


void Text_Init()
{
    if (disp[0]>=3 && disp[0] != text)
    {
          text = disp[0];
          flag = 1;


这个对比程序,跟下一次的程序对比,如果与上次的程序相同,电机不转,反之亦然,我主要有一个疑惑,我的这个传感器时有规律输出信号,在一定范围内波动,如果要实现理想情况,该采用什么样的结构
ID:213173 发表于 2020-8-26 18:11
从楼主混乱不堪的代码猜测:temp = Read_AD_Data(0xE4);获取传感器16位数据,解析temp后得到的信息来控制电机。可是“disp[1]=smgduan[temp%1000/100];//百位”这样的代码提取的信息只能供数码管显示用,其数据内容已经面目全非了,根本不可能用做后续判断条件 if (disp[0]>=3 && disp[0] != text) 。如果要提取temp的百位数据用于判断应当是 if((temp/100%10)>=3 && (temp/100%10) != text)。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

ID:511890 发表于 2020-8-26 15:47
粗略看了下, 整个程序只有第75行 disp[0]=1;//千位  对 disp[0]进行过操作,所以整个程序运行过程中, disp[0]永远等于1。小于3,所以while中的if循环永远只能进第二分支。
由于disp[0] =1 ,所以Text_Init()中的if语句里面的语句不会被执行。执行的是Text_Init1()
void Text_Init1()
{
    if (disp[0]<3 && disp[0] != text)//由于disp[0]=1,text =0,所以判断通过,执行以下程序
    {
          text = disp[0];
          flag1 = 1;
    }
}
到这里得到flag=0,flag1=1,所以程序执行
         if(disp[0]<3)
        {
            if(disp[0]<3)
            {
                       if(flag1=1)
                {
                    run();
                    flag1= 0;
                }
执行一次后就不再执行。
至于你说的电机一直在转,这个有两种可能,一种是硬件电路有问题。另一种的当IN1=IN2=0时电机运行,等于1时电机不转。要确定这种情况只要看下程序刚开始运行时有一个电机停止5秒就能确定。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

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

Powered by 单片机教程网

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