xssr123 发表于 2017-9-15 16:36:35

STC 开源飞控中关于电池电压AD采样部分程序看不懂,请高...

本帖最后由 xssr123 于 2017-9-16 12:29 编辑

这个AD转换后是如何换算出电压的?
程序如下:
#include "config.h"
#include "AD.H"                       

int        xdata Battery = 1200;
u16 xdata ADC0_Last = 6400;
u16 xdata adc0;

#define ADC_START        (1<<6)        /* 自动清0 */
#define ADC_FLAG        (1<<5)        /* 软件清0 */

#define        ADC_SPEED        3                /* 0~15, ADC转换时间(CPU时间数) = (n+1)*32ADCCFG */
#define        RES_FMT                (1<<5)        /* ADC结果格式0: 左对齐, ADC_RES: D11 D10 D9 D8 D7 D6 D5 D4, ADC_RESL: D3 D2 D1 D0 0 0 0 0 */
                                                        /* ADCCFG      1:右对齐, ADC_RES: 0 0 0 0 D11 D10 D9 D8, ADC_RESL: D7 D6 D5 D4 D3 D2 D1 D0 */



//*********************************初始化A/D转换*************************************************
void adc_init()
{
        P0n_pure_input(0x04);        //½«P0.2×÷ΪģÄâÁ¿ÊäÈë
        ADC_CONTR = 0x80;                //ADC on
        ADCCFG = RES_FMT + ADC_SPEED;
}


//*********************************初始化A/D转换*************************************************
void adc_init()
{
      P0n_pure_input(0x04);      //将P0.2作为模拟量输入
      ADC_CONTR = 0x80;                //ADC on
      ADCCFG = RES_FMT + ADC_SPEED;
}

//========================================================================
// 函数: u16      Get_ADC12bitResult(u8 channel)
// 描述:查询法读一次ADC结果。
// 参数: channel:选择要转换的ADC。
// 返回: 10位ADC结果。
// 版本: V1.0, 2016-4-28
//========================================================================
u16      Get_ADC12bitResult(u8 channel)      //channel = 0~15
{
      u8      i;
      ADC_RES = 0;
      ADC_RESL = 0;

      ADC_CONTR = 0x80 | ADC_START | channel;
      NOP(10);                        //
      i = 250;
      do
      {
                if((ADC_CONTR & ADC_FLAG) != 0)      //ADC结束
                {
                        ADC_CONTR &= ~ADC_FLAG;
                        return      ((u16)ADC_RES * 256 + (u16)ADC_RESL);
                }
      }
      while(--i);
      return 0;
}

//**********************************电压处理***************************************
void AD(void)
{
      ADC0_Last = ((ADC0_Last * 3) >> 2) + Get_ADC12bitResult(10);

      adc0 = ADC0_Last >> 2;
      Battery = (int)((float)ADC0_Last * 0.08904f);      //78M05输出4.964V做ADC基准
}

xssr123 发表于 2017-9-15 16:50:18

刚开始忘了加图片,现在弄好了,请高手帮忙看看,谢谢。

蜗牛蜗牛 发表于 2017-9-16 11:00:33

xssr123 发表于 2017-9-15 16:50
刚开始忘了加图片,现在弄好了,请高手帮忙看看,谢谢。

寄存器确实不怎么好看

liaihua1997 发表于 2017-9-16 11:13:15

楼主哪里没看懂?

xssr123 发表于 2017-9-16 12:26:56

本帖最后由 xssr123 于 2017-9-16 12:30 编辑

liaihua1997 发表于 2017-9-16 11:13
楼主哪里没看懂?

电压处理那个程序,根据原理图上计算,当电池电压为11.1V时,AD的输入口电压应当为3.7V,
这个程序最开始处是这样的
int        xdata Battery = 1200;
u16 xdata ADC0_Last = 6400;
u16 xdata adc0;
我无法算出电压为11.1V。
我已经将程序补全,麻烦您再看看,谢谢。

not_at_all 发表于 2017-9-17 19:46:10

线性变化的东西,用 y=ax+b   这条方程即可    很基本的东西,要学以致用

xssr123 发表于 2017-9-18 08:55:46

not_at_all 发表于 2017-9-17 19:46
线性变化的东西,用 y=ax+b   这条方程即可    很基本的东西,要学以致用

能否说的再详细点,根据你的提示,我还是无法理解。

ypc168k 发表于 2018-2-12 23:12:08

本帖最后由 ypc168k 于 2018-2-12 23:13 编辑

xssr123 发表于 2017-9-18 08:55
能否说的再详细点,根据你的提示,我还是无法理解。

你好,共同学习一下,那个0.08904f 这个系数是怎么来的啊?   其实不喜欢看人家写的程序,因为看不懂,自己会的,一定要自己写,只有自己写的自己才知道是干嘛用的,怎么来的。当然了,不会的,还是要多看看前辈们的大作。{:lol:}

Maoliver 发表于 2019-5-29 18:55:50

楼主您好,看了您在17年发表的关于stc飞控里电源部分的帖子,想问您最后解决问题了吗?(我现在也在拼这个四轴)

Maoliver 发表于 2019-5-30 20:47:37

ypc168k 发表于 2018-2-12 23:12
你好,共同学习一下,那个0.08904f 这个系数是怎么来的啊?   其实不喜欢看人家写的程序,因为看不懂,自 ...

我也想问这个来着。。。

Maoliver 发表于 2019-5-30 20:50:39

本帖最后由 Maoliver 于 2019-5-30 20:53 编辑

liaihua1997 发表于 2017-9-16 11:13
楼主哪里没看懂?

大佬好,我想知道左上角那个控制信号排针中接地和接5v的18个管脚是随便选取空余的管脚去接线吗?
还是说只是自己提供两组排针分别接主控板上的5v和地以供拓展备用的方便?
页: [1]
查看完整版本: STC 开源飞控中关于电池电压AD采样部分程序看不懂,请高...