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
刚开始忘了加图片,现在弄好了,请高手帮忙看看,谢谢。
寄存器确实不怎么好看 楼主哪里没看懂? 本帖最后由 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。
我已经将程序补全,麻烦您再看看,谢谢。 线性变化的东西,用 y=ax+b 这条方程即可 很基本的东西,要学以致用 not_at_all 发表于 2017-9-17 19:46
线性变化的东西,用 y=ax+b 这条方程即可 很基本的东西,要学以致用
能否说的再详细点,根据你的提示,我还是无法理解。 本帖最后由 ypc168k 于 2018-2-12 23:13 编辑
xssr123 发表于 2017-9-18 08:55
能否说的再详细点,根据你的提示,我还是无法理解。
你好,共同学习一下,那个0.08904f 这个系数是怎么来的啊? 其实不喜欢看人家写的程序,因为看不懂,自己会的,一定要自己写,只有自己写的自己才知道是干嘛用的,怎么来的。当然了,不会的,还是要多看看前辈们的大作。{:lol:} 楼主您好,看了您在17年发表的关于stc飞控里电源部分的帖子,想问您最后解决问题了吗?(我现在也在拼这个四轴) ypc168k 发表于 2018-2-12 23:12
你好,共同学习一下,那个0.08904f 这个系数是怎么来的啊? 其实不喜欢看人家写的程序,因为看不懂,自 ...
我也想问这个来着。。。 本帖最后由 Maoliver 于 2019-5-30 20:53 编辑
liaihua1997 发表于 2017-9-16 11:13
楼主哪里没看懂?
大佬好,我想知道左上角那个控制信号排针中接地和接5v的18个管脚是随便选取空余的管脚去接线吗?
还是说只是自己提供两组排针分别接主控板上的5v和地以供拓展备用的方便?
页:
[1]