找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2667|回复: 8
收起左侧

3秒内检测不到触发电平就证明电机卡主了

[复制链接]
ID:475031 发表于 2021-7-9 10:04 | 显示全部楼层 |阅读模式
51hei图片_20210709095306.jpg

上图我做的,平均1秒转一圈,每转一圈磁铁触发传感器输出一个低电平,

3秒内检测不到触发电平就证明电机卡主了。输出信号控制电机停止,朋友们,怎么写个程序呢?求的思路,谢谢!


sbit KEY1=P2^0;//检测端口接霍尔传感器输出端,低电平有效
sbit KEY2=P2^1;//输出高电平,启动继电器,断开电源,或者接步进电机控制器的  停止端
void main()
{        KEY1=1;//通电默认高电平        
  KEY2=0;//通电默认低电平   
while(1)
        {
                if(KEY1==0)          //读P2.0引脚
                {

                        delay_ms(5); //延时10ms消抖
                        if(KEY1==0)         //再次判断,防止干扰,增强稳定
                        {





回复

使用道具 举报

ID:539024 发表于 2021-7-9 12:42 | 显示全部楼层
你把霍尔传感器的引脚接到外部中断上,用中断检测下降沿
回复

使用道具 举报

ID:475031 发表于 2021-7-9 12:47 | 显示全部楼层
1543330241 发表于 2021-7-9 12:42
你把霍尔传感器的引脚接到外部中断上,用中断检测下降沿

百度搜破了也没有找到相关例子,
大师,来个例子。这样我也学会了。全网的人也学会了。不胜感激
回复

使用道具 举报

ID:81196 发表于 2021-7-9 16:22 | 显示全部楼层
使用外部中断,设置为上升沿和下降沿触发,那么就可以完整地提取出脉冲的宽度
回复

使用道具 举报

ID:475031 发表于 2021-7-9 16:41 | 显示全部楼层
shumivan 发表于 2021-7-9 16:22
使用外部中断,设置为上升沿和下降沿触发,那么就可以完整地提取出脉冲的宽度

来一段代码。我参考参考。谢谢
回复

使用道具 举报

ID:176854 发表于 2021-7-9 20:01 | 显示全部楼层
#include "STC12C52xx.H"  //根据实际芯片修改头文件

#define Delay_Time 200   //(需要检测时间(单位:秒) - 1) * 100
sbit Key = P2^0;         //修改需要检测引脚

unsigned int Counter = 0;
unsigned char Key_Loop = 0;


//-----------------------------------------------

void Timer0_Init() //12MHz  10ms
{
    AUXR &= 0x7F;                    
    TMOD |= 0x01;                  
                TL0 = 0xF0;               
    TH0 = 0xD8;               
    TR0 = 1;                        
    ET0 = 1;                        
}

void Read_Key()
{
    switch(Key_Loop)
                {
                  case 0:
                        {
                          if(!Key)
                                {
                                  Counter = 0;
                                }
                                else if(Counter >= Delay_Time)
                                {
                                  Key_Loop = 1;
                                }
                                break;
                        }
                        case 1:
                        {
                          //加入电机堵转后的处理程序
                                break;
                        }
                        default:
                        {
                          Key_Loop = 0;
                                break;
                        }
                }
}

void main(void)
{
                P2M1 |= (1<<0);   //将检测引脚设置为高阻输入
                P2M0 &= ~(1<<0);  //将检测引脚设置为高阻输入
                Timer0_Init();

                EA = 1;                        
                while (1)
                {
                        Read_Key();
                }
}

void tm0_isr() interrupt 1 //定时器每10ms中断一次
{
          TL0 = 0xF0;               
    TH0 = 0xD8;               
    Counter++;
}
回复

使用道具 举报

ID:57657 发表于 2021-7-10 08:35 | 显示全部楼层
  1. #include "reg51.h"
  2. sbit KEY1 = P2 ^ 0;//检测端口接霍尔传感器输出端,低电平有效
  3. sbit KEY2 = P2 ^ 1;//输出高电平,启动继电器,断开电源,或者接步进电机控制器的  停止端

  4. void InitTimer0(){      //晶振频率:12Mhz
  5.     TMOD = 0x01;
  6.     TH0 = 0xB1;
  7.     TL0 = 0xE0;
  8.     EA = 1;
  9.     ET0 = 1;
  10.     TR0 = 1;
  11. }
  12. unsigned char time = 0;      //霍尔传感器 高电平每20毫秒加1 (加满则停止计数,防止溢出) 低电平清0
  13. void Timer0Interrupt() interrupt 1{     //20ms 定时器0中断
  14.     TH0 = 0xB1;
  15.     TL0 = 0xE0;
  16.     if (KEY1) {
  17.         if (time != 0xFF) time++;
  18.         KEY2 = !(time >= 150);      //150个20毫秒
  19.     } else {
  20.         time = 0;
  21.         KEY2 = 1;
  22.     }
  23. }


  24. void main(){
  25. KEY1 = 1;//通电默认高电平        
  26. KEY2 = 0;//通电默认低电平   
  27. InitTimer0();
  28. while(1);
  29. }
复制代码
回复

使用道具 举报

ID:161164 发表于 2021-7-11 14:46 | 显示全部楼层
  1. void main()
  2. {
  3.     Motor_Run = 1;//運行標志
  4.     if(Scan_Count++ > 1000)
  5.     {
  6.         Scan_Count=0;
  7.         Rotate_Count++;
  8.         if(Hall_Pin_Old && !Hall_Pin)//下降沿檢測
  9.         {
  10.             Rotate_Stop_Count=0;
  11.         }
  12.         Hall_Pin_Old = Hall_Pin;
  13.         if(Rotate_Stop_Count++ > 200)//停轉超時
  14.         {
  15.             Motor_Run = 0;
  16.         }
  17.     }
  18. }
复制代码


回复

使用道具 举报

ID:808939 发表于 2021-7-11 17:22 | 显示全部楼层
你把霍尔传感器的引脚接到外部中断上,用中断检测下降沿
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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