压力传感器检测压力,然后高了放气,低了充气,这样一个功能,充气是正常的,放气过程中不太正常,求指导

2019-07-15 08:36发布

压力范围为25-35,比如如果压力超上限,系统会控制电磁阀放气,程序写着应该是缓慢放气,但是实际压力在45(每次不一样)左右维持几秒,然后突然降到32,出现这种压力下降太多的情况,什么问题呀?file:///D:QQ2013Users648019770ImageGroupA$1`0O}T]`LE1X6O210PAQK.png A`0O}T]`LE1X6O210PAQK.png

附上程序,不知道是pwm程序控制问题还是其他问题
#include<reg51.h>
#include<intrins.h>
#include<string.h>
#include "delay.h"
#include "lcd.h"
#include "adc.h"
#include "key.h"
#include "display.h"
#include "uart.h"
void         serial_init();//串口初始化函数
uchar pressure_high=35;
uchar pressure_low=25;
uchar  data date_tab[8];
uint  enable;//串口开关控制位,1为打开
uint flag=0;//按键标志位


uint TestDisMode=0;
uint PresValue=0;


uchar QB_pwm_H=0;//气泵高电平时间
uchar PQF_pwm_H=0;//排气阀高电平时间


sbit QB_pwm=P2^0;//控制气泵pwm信号
sbit PQF_pwm=P2^1;//控制排气阀pwm信号
sbit BEEP=P2^2;//蜂鸣器引脚


void  main()
{


        uart_init();//串口初始化
        TH0=(65536-1000)/256; //1ms初值
        TL0=(65536-1000)%256;
        ET0=1;
        //TR0=1;//初始化时关闭T0,等按下开始再启动T0
        TR0=0;//初始化T0停止
        EA=1;//开总中断
       




       
  //PQF_pwm=1;        //排气阀关闭
        //QB_pwm=1;        //气泵关闭
        //BEEP=1;//蜂鸣器关闭
        lcd_init();
        display_start();
        delay_ms(10);
       
   while(1)
   {         
           keyscan();
           if(TestDisMode==1)
     {
                               
                           TR0=1;//按下开始键后T0开启
                           delay_ms(10);//不加这句,显示在第一格
                           Volt_pressure_display();
                         
/*************调节机制*******************************/
                                 if(PresValue>pressure_high && PresValue<90)
                                 {
                                               
                                          Set_date_dis3();
                                                PQF_pwm_H=4;//调节排气阀放气速度,越大放气越快
                                                QB_pwm_H=0;//关闭气泵
                                          //BEEP=0;//蜂鸣器报警
                                 }
                                 if(PresValue>=90)
                                 {
                                          Set_date_dis3();
                                                PQF_pwm_H=8;//调节排气阀放气速度,越大越快               
                                                QB_pwm_H=0;//关闭气泵
                                          //BEEP=0;//蜂鸣器报警
                                 }
                                 if(PresValue<pressure_low && PresValue>5)
                                 {
                                                Set_date_dis4();
                                          QB_pwm_H=5;//调节气泵打气速度,越大充气越快
                                          PQF_pwm_H=0;//关闭排气阀
                                          //BEEP=0;//蜂鸣器报警
                                 }
                                 if(PresValue<=5)
                                 {
                                                Set_date_dis4();
                                          QB_pwm_H=8;//调节气泵打气速度,越大充气越快
                                          PQF_pwm_H=0;//关闭排气阀
                                          //BEEP=0;//蜂鸣器报警
                                 }
                                 if(PresValue>=pressure_low && PresValue<=pressure_high)
                                 {
                                               
                                          Set_date_dis5();
                                          QB_pwm_H=0;//关闭气泵
                                          PQF_pwm_H=0;//关闭排气阀
                                          BEEP=1;//蜂鸣器关闭
                                 }
/*************调节机制*******************************/


                                 if(enable==1)//如果上位机按下开始采集,则发送0x01给下位机
                                 {
                                               
                                                 Send(date_tab[4]);//发送压力千位
                                          Send(date_tab[5]);//发送压力百位
                                          Send(date_tab[6]);//发送压力十位
                                                Send(date_tab[7]);//发送压力个位
                                          delay_ms(200); //200ms发送一次
                                 }
                                 if(enable==0)//如果没有收到01,则关闭ad采集,不发送数据
                                 {
                                       
            TR0=0;
                                 }
                                 
                                 


                                    
       }                 
       else
       {
                         TR0=0;
                                 
             }                 
   }
}


void timer0() interrupt 1    //T0主要控制输出两路pwm信号和采样频率
{
        uchar t0;//t0控制pwm信号时间变量
        uchar t1;//t1控制采样频率时间变量
        TH0=(65536-1000)/256;      //1ms初值
        TL0=(65536-1000)%256;
       
        //下面是PWM信号时间
        t0++;
        if(t0<QB_pwm_H)
        {
                QB_pwm=0;        //气泵工作               
        }
        else
        {
           QB_pwm=1;        //气泵关闭
        }
        if(t0<PQF_pwm_H)<
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
人中狼
1楼-- · 2019-07-15 22:13
局部变量好像时在调用相应的程序时才会被赋值和使用,在退出该程序后,变量则被放弃,所以这个变量单元有可能会被分配给其他程序的局部变量使用,而导致数值变化。全局变量则在整个程序运行中只有对该变量进行操作时才会改变该变量的数值。中断里使用到的做判断用的,或根据中断的次数更改数值的变量最好都是全局变量
jjj648019770
2楼-- · 2019-07-16 01:52
人中狼 发表于 2018-4-19 13:17
局部变量好像时在调用相应的程序时才会被赋值和使用,在退出该程序后,变量则被放弃,所以这个变量单元有可能会被分配给其他程序的局部变量使用,而导致数值变化。全局变量则在整个程序运行中只有对该变量进行操作时才会改变该变量的数值。中断里使用到的做判断用的,或根据中断的次数更改数值的变量最好都是全局变量 ...

我等下按你说的把t0和t1都设成全局变量试试看先,不行再来请教你哦,程序上其他还有什么不对会导致我说的压力显示问题吗?
jjj648019770
3楼-- · 2019-07-16 07:33
人中狼 发表于 2018-4-19 13:17
局部变量好像时在调用相应的程序时才会被赋值和使用,在退出该程序后,变量则被放弃,所以这个变量单元有可能会被分配给其他程序的局部变量使用,而导致数值变化。全局变量则在整个程序运行中只有对该变量进行操作时才会改变该变量的数值。中断里使用到的做判断用的,或根据中断的次数更改数值的变量最好都是全局变量 ...

在吗,我按你的把to,t1放到main最前面,定义为全局变量,压力在放气时,还是会有突然下降的过程,不知道问题在哪里,求指导!
jjj648019770
4楼-- · 2019-07-16 11:32
jjj648019770 发表于 2018-4-19 19:02
在吗,我按你的把to,t1放到main最前面,定义为全局变量,压力在放气时,还是会有突然下降的过程,不知道问题在哪里,求指导!

试了几次,这种情况,压力40左右的那会,特别容易突然下降
EHDWG11RHX6FJ5%NW5V9T(8.png

一周热门 更多>