登录|立即注册|使用QQ帐号登录
论坛 > 24小时必答区
发帖|
看4177|回15|收藏
楼主 ID:475031 只看他
2021-7-9 10:15

给你一个检测开关  霍尔传感器,
转动到传感器位置输出的是低电平。


51hei图片_20210709095306.jpg

沙发 ID:539024 只看他
2021-7-9 12:40
用单片机检测下降沿就行,转动的话肯定是下降沿的,要是测转速的话就是用定时器,检测单位时间内下降沿个数
板凳 ID:475031 只看他
2021-7-9 12:48

引用:

1543330241 发表于 2021-7-9 12:40
用单片机检测下降沿就行,转动的话肯定是下降沿的,要是测转速的话就是用定时器,检测单位时间内下降沿个数

来个简单的例子。谢谢
地板 ID:934353 只看他
2021-7-9 13:14

引用:

鬼推磨 发表于 2021-7-9 12:48
来个简单的例子。谢谢

直接要程序可还行?这论坛不是帮你写程序的,是大家互相探讨问题的
5# ID:475031 只看他
2021-7-9 13:29

引用:

开心就好hhhh 发表于 2021-7-9 13:14
直接要程序可还行?这论坛不是帮你写程序的,是大家互相探讨问题的

        看看折断代码。没有反应。


void main()
{
while(KEY1)//高电平
{
a++;
if(a>100)//这里的100不一定是2s,要调试获得准确值,
break;
}
while(!KEY1)//低电平
{
b++ ;
if(b>100)
break;
}
if((a>100)||(b>100))//表明一段时间内电平都没有变化
{
// 处理代码
        KEY5=0;//停止电机信号
}       
                       
        }                       
6# ID:934353 只看他
2021-7-9 13:40

引用:

鬼推磨 发表于 2021-7-9 13:29
看看折断代码。没有反应。

你想要有什么反应呢?电机停止?你这样判断电机是否停止是绝对不对的
7# ID:475031 只看他
2021-7-9 13:43

引用:

开心就好hhhh 发表于 2021-7-9 13:40
你想要有什么反应呢?电机停止?你这样判断电机是否停止是绝对不对的

判断KEY1端口在2秒内没有电平变化。就足以证明。电机被阻转或者异物卡主了。,实际程序下载到单片机运行。我按住电机不让它动。但程序并没有控制电机停止。
8# ID:934353 只看他
2021-7-9 13:55

引用:

鬼推磨 发表于 2021-7-9 13:43
判断KEY1端口在2秒内没有电平变化。就足以证明。电机被阻转或者异物卡主了。,实际程序下载到单片机运行 ...

key5连接什么?
9# ID:475031 只看他
2021-7-9 14:15

key5连接控制继电器模块的输入端,输出低电平,继电器就会吸合。断开电机的电源
10# ID:934353 只看他
2021-7-9 14:36
首先你这个a++到100 ,这样的循环执行根本达不到两秒,甚至一毫秒都没有,所以你这样判断电机是否转动是不对的,其次你测试的时候不需要按住电机不动,只要将霍尔远离电机即可,然后再去观察电机是否停下
11# ID:844772 只看他
2021-7-9 14:37

引用:

鬼推磨 发表于 2021-7-9 13:43
判断KEY1端口在2秒内没有电平变化。就足以证明。电机被阻转或者异物卡主了。,实际程序下载到单片机运行 ...

是挺奇怪啊,只要程序运行到这,应该能停啊。
12# ID:475031 只看他
2021-7-9 14:47

引用:

开心就好hhhh 发表于 2021-7-9 14:36
首先你这个a++到100 ,这样的循环执行根本达不到两秒,甚至一毫秒都没有,所以你这样判断电机是否转动是不 ...

a++到1000 ,改到10000也没用, 我怀疑代码到底有用没有啊
13# ID:475031 只看他
2021-7-9 15:22

sbit   KEY1 = P2^0;//判断端口
sbit   KEY2 = P2^1;//LED灯
sbit   KEY5 = P2^2;//停止电机

void main()
{
    while(1)
   {
       if (KEY1==0)
           {
             //KEY1是低电平
           KEY2=0//LED亮
           }
           else if (KEY1==1)
           {
             //KEY1是高电平
             KEY2=1//LED灭
           }
   }
}

此段代码只是检测IO口高低变化状态LED显示状态。怎么检测它无变化啊
14# ID:401564 只看他
2021-7-9 16:24
测转速不就行了,那么简单
通过IO的高低电平来计算转速
对于实际应用,一秒低于0.001圈的,判定为不转动
一直是高电平的判定为不转动
一直是低电平的判定为不转动
15# ID:475031 只看他
2021-7-9 16:40

代码:

  1. sbit IN=P2^0;
  2. sbit OUT=P2^1;
  3. uint time ;
  4. void main()
  5. {
  6. OUT=0;//继电器不动作
  7. time=0;
  8. while(1)
  9. {
  10. while(IN==1)//高电平
  11. {
  12. delayms(10);
  13. time++;
  14. if(time>1800) OUT=1;//超过3S,动作
  15. }
  16. time=0;
  17. while(IN==0)//低电平
  18. { delayms(10);
  19. time++;
  20. if(time>1800) OUT=1;//超过3S,动作
  21. }
  22. time=0;
  23. }
  24. }
把你代码替换到我代码中,可以运行。就是这个time>300时间太短,我改为1800以上,能满足我说的功能要求。谢谢大师解决了我的问题,,

51hei图片20210709163531.png

16# ID:934353 只看他
2021-7-9 17:48

引用:

鬼推磨 发表于 2021-7-9 16:40
把你代码替换到我代码中,可以运行。就是这个time>300时间太短,我改为1800以上,能满足我说的功能要求。谢 ...

你这个时间最好用定时器,不然时间会有误差,而且判断电机有无转动最好用下降沿或者上升沿,可以用外部中断,也可以用普通io口模拟外部中断,你这样测会有很大的误差,非常容易受干扰,希望你自己好好研究一下

51黑电子论坛

Powered by Discuz! X3.1

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