找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 119|回复: 2
打印 上一主题 下一主题
收起左侧

电压表自动换档怎么才能实现第一次测量时从最高档开始判断然后根据测量值选合适的量程

[复制链接]
回帖奖励 100 黑币 回复本帖可获得 5 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
ID:1108299 发表于 2024-4-17 14:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void main(void)
{


    LCD_ON;
    P0M0 = 0x80;       P0M1 = 0;
    P1M0 = 0;       P1M1 = 0;
    P2M0 = 0;       P2M1 = 0;
    P3M0 = 0;       P3M1 = 0;
    P4M0 = 0x20;    P4M1 = 0;
    P5M0 = 0;       P5M1 = 0;


    Delay_ms(100);
    Zero_Coeff_Init();
    lcd_system_reset();
    ads_initial();
    Delay_ms(100);
    string_write(0, 0, " Welcome to use ");
    string_write(0, 1, "                ");
    Delay_ms(3500);
    string_write(0, 0, "Range:10mV      ");
    string_write(0, 1, "Volt:0.000mVDC  ");
    ads_convert();


    while (1)
    {
        Delay_ms(100);
        //熄屏省电判断
         if(++power_saving_timer > 299){//30秒熄屏
             LCD_OFF;
         }


        //定时数据采集
        if(++data_acqui_timer > 1){//100ms采集一次
            if(current_ch < 4){//自动换挡
                if((volt_val > 9900)&&(current_ch < 3)){
                    current_ch++;
                    Input_CH_Select();
                }else if((volt_val < 10)&&(current_ch > 1)){
                    current_ch--;//
                                                                        Input_CH_Select();
                                                                }                                       
            }
                                                if(current_ch < 4||current_ch < 7){//自动换挡
                if((volt_val > 9000)&&(current_ch < 6)){//
                    current_ch++;
                    Input_CH_Select();
                }else if((volt_val < 100)&&(current_ch > 4)){//5
                    current_ch--;//
                                                                        Input_CH_Select();
                                                                }
                                                                else if (volt_val < 20){
                                                                        current_ch=6;
                                                        Input_CH_Select();
                                                        }       
                                                        }
                                               
                                                        if(current_ch==4){
                                                                        P07L=0;
                                                                        Delay_ms(30);
                                                                        }
                                                                        if(current_ch==5){
                                                                        P07L=1;
                                                                                Delay_ms(30);
                                                                }
                                                       
            data_acqui_timer = 0;
                                       

            //等待AD采集结束
            while(1){
                ad_val = ads_result();
                if((ads_config_reg & 0x80) == 0)break;
            }
            volt_val = (ad_val - zero_val[current_ch - 1].sint_val)/coeff[current_ch - 1].float_val;
            if(volt_val > 9999)volt_val = 9999;
            if(volt_val < 0)volt_val = volt_val * -1;
            Disp_Volt_Val();
            ads_convert();//开启下一次采集
        }






  if((volt_val > 9000)&&(current_ch < 6)){//
                    current_ch++;
                    Input_CH_Select();
                }else if((volt_val < 100)&&(current_ch > 4)){//5
                    current_ch--;//
                                                                        Input_CH_Select();
                                                                }
                                                                else if (volt_val < 20){
                                                                        current_ch=6;
                                                        Input_CH_Select();
                                                        }       
                                                        }这段程序没测量时一直4 5 6通道变换,有没有大佬讲一下如何在内有测量时保持在6通道。



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:883242 发表于 2024-4-17 16:17 | 只看该作者
根据你的代码逻辑,没有输入的时候应该停留在最低档位上,现在来回乱跳,应该是输入悬空的时候,ADC输出值不是0造成的,检查硬件吧。
回复

使用道具 举报

板凳
ID:1108299 发表于 2024-4-17 17:07 | 只看该作者
Hephaestus 发表于 2024-4-17 16:17
根据你的代码逻辑,没有输入的时候应该停留在最低档位上,现在来回乱跳,应该是输入悬空的时候,ADC输出值 ...

else if (volt_val < 20){
      current_ch=6;
       Input_CH_Select();
         }       我没加这行代码之前,没有输入的时候确实停留在最低档位上,
现在我想想的是没有给它输入的时候,先停留在6的档位,然后当有输入时在根据输入信号的大小去到它合适的量程。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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