• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

KS103超声波正常工作几秒后单片机就停止工作?

1589352726@qq.com 2017-11-04 浏览量:1450
我用STM32写的KS103超声波模块程序,在单片机复位后KS103正常工作,背面的LED灯正常闪烁,能够检测到距离并显示出来,但是复位几秒到几十秒 不等后单片机就停止工作,我在定时器和主函数里面写的LED灯闪烁全部停止工作???想请教下有经验的,是什么原因?QQ截图20171104145149.jpg
0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 1. 仿真调试一下,看下流程是否完全如预期

    2. 是不是有中断信号影响了

    3. 器件稳定性

    • 发布于 2017-11-29
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了 :请核实该料号是否正确 回复

其他答案 数量:9
  • 程序跑飞了吧。先检查你代码,是不是有数组越界,空指针等情况。
    • 发布于2017-11-04
    • 举报
    • 评论 1
    • 0
    • 0
6bf06e6f65cf6a72 回复了 chownn :并没有 检查出来 回复

  • //以下依次是主程序,,KS103超声波程序,,定时器程序
    
    /*main.c*/
    
    
    #include "delay.h"
    #include "key.h"
    #include "sys.h"
    #include "usart.h"
    #include "myiic.h"
    #include "KS103.h"
    #include "lcd.h"
    #include "timer.h"
    #include "led.h"
    
    u8 t=2,p;
    u32 sum1,sum2,sum3,sum4,sum5,sum6,sum7,sum8,sum9,sum10,sum11,sum12,sum13,sum14,sum15,
        sum16,sum17,sum18,sum19,sum20;
    float sum_1,sum_2;	
    
    int main(void)
    {	 
    
    	u8 key=0;
    	delay_init();	    	 //延时函数初始化	  
      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
    	uart_init(9600);	 	//串口初始化为115200	
    	LCD_Init();			   	//初始化LCD 			 	 	
    	IIC_Init();			//IIC初始化 
    	KEY_Init();
    	LED_Init();
      TIM3_Int_Init(999,7199);
     	POINT_COLOR=BLUE;//设置字体为蓝色	  
    	LCD_ShowString(60,80,200,20,16,"sum2: cm");
    	LCD_ShowString(60,120,200,20,16,"t : ");
      while(1)
    	{ 
    		p++;                
    		key=KEY_Scan(0);	
    	  if(key)
    		{						   
    			switch(key)
    			{				 
    				case WKUP_PRES:	t++;break;
    				case KEY2_PRES:	break;
    				case KEY1_PRES:	t--;break;
    				case KEY0_PRES: break;
    				default:  break;
    			}
        }
    		LCD_ShowNum(60+40,120,t,2,16);
    		if(p==20){LED1=!LED1;p=0;}
    		delay_ms(10);
    		
    	}
    
    	 
    }
    
    
    
    
    
    
    
    
    • 发布于2017-11-04
    • 举报
    • 评论 0
    • 0
    • 0

  • /*KS10X.c*/
    #include "myiic.h"
    #include "sys.h"
    #include "delay.h"
    #include "usart.h"
    #include "math.h"
    #include "ks103.h"
     
    //#define uchar unsigned char
    //#define uint unsigned int
     
    u16 sum;    
     
    /***************************************************************************
    *******************************************************************************/
     
    void Single_WriteI2C(u8 SlaveAddress,u8 REG_Address,u8 REG_data)
    {       
        IIC_Start();                    //起始信号
        IIC_Send_Byte(SlaveAddress);   //发送设备地址+写信号
     
        while(IIC_Wait_Ack());
     
        IIC_Send_Byte(REG_Address);    //内部寄存器地址
     
        while(IIC_Wait_Ack());                          
                                        /**********************/
        IIC_Send_Byte(REG_data);       //内部寄存器数据
     
        while(IIC_Wait_Ack());                                  /**********************/
        IIC_Stop();                     //发送停止信号
    }          
    //**************************************
    //从I2C设备读取一个字节数据
    //**************************************
    u8 Single_ReadI2C(u8 SlaveAddress,u8 REG_Address)
    {
        u8 REG_data=0;
        IIC_Start();    
        IIC_Send_Byte(SlaveAddress);    
     
        while(IIC_Wait_Ack());
        IIC_Send_Byte(REG_Address);
     
        while(IIC_Wait_Ack());                              /**********************/
        IIC_Start();
        IIC_Send_Byte(SlaveAddress+1);   
         
        while(IIC_Wait_Ack());
     
        delay_us(100);//50
     
        REG_data=IIC_Read_Byte(0);
     
    //  IIC_NAck();
     
    //  delay_us(2);
       
        IIC_Stop();  
         
        return REG_data;
    }
    /**********************  读取数据 **********************/
    u32 Read_KS10X(u8 SlaveAddress)                    
    {    
    //       delay_ms(80);
             sum=Single_ReadI2C(SlaveAddress,0x02);             //高8位
             sum<<=8;
             sum+=Single_ReadI2C(SlaveAddress,0x03);                //低8位
             return sum;
    }
     
    void Change_Addr(u8 OldAdddr,u8 NewAddr)
    {
    //       delay_ms(500);
             Single_WriteI2C(OldAdddr,0x02,0x9a);             //默认原地址是0x00;
             delay_ms(1);
             Single_WriteI2C(OldAdddr,0x02,0x92);
             delay_ms(1);
             Single_WriteI2C(OldAdddr,0x02,0x9e);
             delay_ms(1);
             Single_WriteI2C(OldAdddr,0x02,NewAddr);
             delay_ms(100);
     
    //           Single_WriteI2C(NewAddr,0x02,0xb0);
    //           delay_ms(80);
    }
     
    float Read_KS10X_Data(u8 SlaveAddress)
    {
            float sumx;
            float sum_x;
            Single_WriteI2C(SlaveAddress,0x02,0xb0);
            delay_ms(80);
             
            sumx=Read_KS10X(SlaveAddress);          //读出第一个超声波的数据
           
            sum_x=(float)sumx/10;
     
            return sum_x;
    }
     
    void KS10X_Change_Addr_Init(u8 OldAddr,u8 NewAddr)  //此函数用来实现选择超声波的地址
    {
            Change_Addr(OldAddr,NewAddr);
            delay_ms(1000);
    	      delay_ms(1000);
    }
    
    
    
    
    
    #include "timer.h"
    #include "led.h"
    #include "lcd.h"
    #include "ks103.h"
    extern float sum_2;
    u8 add=0xe8,h;
    extern u8 t;
    //TIM3 PWM部分初始化    
    //PWM输出初始化
    //arr:自动重装值
    //psc:时钟预分频数
    //void TIM3_PWM_Init(u16 arr,u16 psc)
    //{  
    //	GPIO_InitTypeDef GPIO_InitStructure;
    //	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    //	TIM_OCInitTypeDef  TIM_OCInitStructure;
    //	
    
    //	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);	//使能定时器3时钟
    // 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟
    //	
    ////	GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射  TIM3_CH2->PB5    
    // 
    //   //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形	GPIOB.5
    //	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //TIM_CH2
    //	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
    //	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    //	GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
    // 
    //   //初始化TIM3
    //	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
    //	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 
    //	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
    //	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
    //	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
    //	
    //	//初始化TIM3 Channel2 PWM模式	 
    //	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
    // 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
    //	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
    //	TIM_OC4Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2
    
    //	TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器
    // 
    //	TIM_Cmd(TIM3, ENABLE);  //使能TIM3
    //	
    
    //}
    
    
    
    • 发布于2017-11-04
    • 举报
    • 评论 0
    • 0
    • 0

  • 可以仿真看看,是不是进了硬件错误中断之类的异常状态。加个看门狗,看看能起作用吗。
    • 发布于2017-11-04
    • 举报
    • 评论 3
    • 0
    • 0
6bf06e6f65cf6a72 回复了 great_CC :仿真只会简单一点的,,这个不太会,看门狗我试试看 回复
6bf06e6f65cf6a72 回复了 great_CC :加了看门狗不起作用,看门狗一直在刷新,,但是程序死了 回复
电子老工程师 回复了  :这种应该是氧化腐蚀现象,导致陶瓷封装表面颜色脱落。 回复

  • 可能是进入了硬件错误中断了。可以仿真看看。

    你是不是使用了系统了,内存配置不合理会这种情况。

    或是使用了指针,指针使用不正确,地址不对,程序跑飞。

    • 发布于2017-11-05
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :U2J是新型的比C0G提供更高的电容值 回复

  • 最好是使用仿真器看看吧。要不不知道你的程序到底是停在了哪里。
    • 发布于2017-11-05
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :没有停产,见官网衔接 https://www.ti.com.cn/sitesearch/cn/docs/universalsearch.tsp?searchTerm=UCC24610DRBR#q=UCC24610DRBR&t=everything&linkId=1 回复

  • 是不是模块没有响应,而一直在等待模拟的通讯呢
    • 发布于2017-11-05
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :卷装 回复

  • 应该是程序的问题,你用Keil调试一下,看看停止工作时卡在哪里了
    • 发布于2017-11-15
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :https://datasheet.lcsc.com/szlcsc/SOCAY-Elec-SMAJ12A_C305630.pdf 回复

  • 用printf调试一下看看卡在哪个地方,是不是卡在死循环里面了?

    • 发布于2017-12-21
    • 举报
    • 评论 2
    • 0
    • 0
电子老工程师 回复了  :TDK已查不到了,无法获取该物料的电参数及分类,无法核实的寻料 回复
电子老工程师 回复了  :跟客户确认一下型号是否正确,这个型号查不到具体参数, 回复

相关问题

问题达人换一批

KS103超声波正常工作几秒后单片机就停止工作?