标题: 请问有辉芒微FT61E145或类似的辉芒微单片机有用自带ADC测量供电电池电压例程吗 [打印本页]

作者: hack2800    时间: 2024-8-28 10:22
标题: 请问有辉芒微FT61E145或类似的辉芒微单片机有用自带ADC测量供电电池电压例程吗
请问有辉芒微FT61E145或类似的辉芒微单片机有用自带ADC测量供电电池电压例程吗?芯片供电是电池,如果不接外部电阻分压连电池测量(这种官网有例程,想不接分压电阻,省IO口),直接用自带的内部ADC测电池电压,之前发了一个贴,但给的分太少了,重新发一个,谢谢了

作者: hcfat51h    时间: 2024-8-28 10:22
这个官方网站上有例程啊,稍微改一下就可以了.我自己运行过的,仿真器上测试3.4V,仿真结果是3424mV,这个误差不超过1%,如果要求不高,结果还可以接受了;
        <........省略>,
        POWER_INITIAL();                                                    //初始化
        ADC_INITIAL();                                                            //ADC初始化       
         
        while(1)
        {
                adcData = GET_ADC_DATA(7);                                         //通道7 AD值
                theVoltage = (unlong)adcData*8*1000/0xFFF;        //电压放大1000倍                       
                NOP();
                NOP();
        }
作者: 飞云居士    时间: 2024-8-28 15:18
#include <stdio.h>

// 定义 ADC 模块的基地址和寄存器偏移 (根据芯片手册修改)
#define ADC_BASE 0x40000000
#define ADC_CTRL_OFFSET 0x00
#define ADC_CH_OFFSET 0x04
#define ADC_SAMPLE_RATE_OFFSET 0x08
#define ADC_RESULT_OFFSET 0x0C

// 定义 ADC 控制寄存器中的位域
#define ADC_CTRL_ENABLE (1 << 0)
#define ADC_CTRL_START (1 << 1)
#define ADC_CTRL_INTERRUPT (1 << 2)

// 定义 ADC 通道、参考电压和分辨率
#define ADC_CHANNEL 0
#define ADC_REF_VOLTAGE 3.3
#define ADC_RESOLUTION 12

// 初始化串口 (根据您的硬件平台修改,用于显示测量值)
void UART_Init() {
    // ...
}

// 初始化 ADC 模块
void ADC_Init() {
    // 配置 ADC 时钟 (根据芯片手册修改)
    // ...

    // 配置 ADC 控制寄存器
    *(uint32_t *)(ADC_BASE + ADC_CTRL_OFFSET) |= ADC_CTRL_ENABLE;

    // 配置 ADC 通道
    *(uint32_t *)(ADC_BASE + ADC_CH_OFFSET) = ADC_CHANNEL;

    // 配置 ADC 采样率
    // ...

    // 其他配置 (根据芯片手册修改)
    // ...
}

// 读取 ADC 转换结果
uint16_t ADC_Read() {
    // 启动 ADC 转换
    *(uint32_t *)(ADC_BASE + ADC_CTRL_OFFSET) |= ADC_CTRL_START;

    // 等待转换完成 (根据芯片手册修改)
    // ...

    // 读取 ADC 转换结果
    return *(uint16_t *)(ADC_BASE + ADC_RESULT_OFFSET);
}

// 将 ADC 数字值转换为电压值
float ADC_ToVoltage(uint16_t adc_value) {
    return adc_value * ADC_REF_VOLTAGE / (1 << ADC_RESOLUTION);
}

int main() {
    UART_Init();
    ADC_Init();

    while (1) {
        uint16_t adc_value = ADC_Read();
        float battery_voltage = ADC_ToVoltage(adc_value);

        printf("Battery voltage: %.2fV\n", battery_voltage);

        // 添加延时
        delay_ms(1000); // 根据需求调整延时时间
    }

    return 0;
}

作者: hcfat51h    时间: 2024-8-28 17:23
FT61E145不是有个AD通道可以测试1/4 Vdd的电压?
作者: hack2800    时间: 2024-8-28 20:24
hcfat51h 发表于 2024-8-28 17:23
FT61E145不是有个AD通道可以测试1/4 Vdd的电压?

看手册是有个通道测1/4 VDD,但测出数据不知道处理,否则VDD是4倍ADC数值,但还是没转化成电压?
作者: hezezeze    时间: 2024-8-29 09:31
你想要直接用辉芒微FT61E145或类似芯片的内部ADC测量电池电压,而不使用外部电阻分压,这是可以实现的,但需要一些额外的考虑和处理。
以下是实现方法和需要注意的事项:
1. 芯片内部ADC的参考电压:首先要确定FT61E145或类似芯片内部ADC的参考电压。通常,内部ADC的参考电压是芯片内部的固定电压,例如3.3V或2.5V。  你需要查阅芯片的datasheet,找到ADC参考电压的相关信息。
2. 电池电压范围:确定你想要测量的电池电压范围。例如,如果你使用的是3.7V的锂电池,它的工作电压范围可能是3.0V到4.2V。
3. ADC精度和分辨率:内部ADC的精度和分辨率会影响测量结果的准确性。  如果你的电池电压范围很小,或者你对精度要求不高,内部ADC可能足以满足需求。但是,如果需要更高的精度,你可能需要使用外部ADC或其他方法。
4. 直接测量电压可能超出ADC的量程:如果你的电池电压范围大于内部ADC的参考电压,你需要将电池电压进行分压。 由于你想要避免使用外部电阻,可以考虑利用内部的基准电压作为分压器的一部分。例如,你可以使用一个内部的基准电压为2.5V,并将电池电压接入一个内部的电阻网络,以得到一个低于2.5V的电压,然后将其送到ADC进行测量。
5. 电压转换公式: 你需要根据ADC参考电压、电池电压范围、分压比等因素,推导出一个公式,将ADC读取到的数字量转换成实际的电池电压。

示例代码 (伪代码):

```c
//假设内部ADC参考电压为3.3V,电池电压范围为3.0V到4.2V

//使用内部基准电压作为分压器的一部分
//将电池电压接入一个内部电阻网络,将电压降到低于3.3V
//假设分压比为1:2,则ADC读取到的电压为电池电压的1/3

//读取ADC值
adc_value = read_adc();

//计算电池电压
battery_voltage = adc_value * 3.3 * 2 / 4096; //假设ADC分辨率为12位,即4096个量化值

//输出电池电压
printf("电池电压:%fV\
", battery_voltage);
```
注意事项:
仔细阅读FT61E145或类似芯片的datasheet,了解其ADC的特性和使用方法。
确保你的程序逻辑正确,避免出现误差。
在实际应用中,你需要进行实际测量和校准,以确保测量结果的准确性。
总结:
直接使用内部ADC测量电池电压是可行的,但需要仔细考虑芯片的特性和电池电压范围,并进行必要的处理。  

希望以上信息对你有帮助!
作者: hcfat51h    时间: 2024-8-29 10:23
参考电压:0x0FFF=1/4Vdd:ADC数值,
作者: hack2800    时间: 2024-8-29 10:51
hcfat51h 发表于 2024-8-29 10:23
参考电压:0x0FFF=1/4Vdd:ADC数值,

参考了网官的其它ADC测量,有想过,但不确定,本来想拿来主义更快,现在手头还在画张简单的板,等到手了试一下,到时候有结果了再来回复,先谢了
作者: hack2800    时间: 2024-8-29 11:00
飞云居士 发表于 2024-8-28 15:18
#include

// 定义 ADC 模块的基地址和寄存器偏移 (根据芯片手册修改)

感谢,看了手册,里面没有3.3V参考电压,但程序思路应该是相通的,后面我自己多试试
作者: hack2800    时间: 2024-8-29 11:02
参考了网官的其它ADC测量,有想过各种情况,但不确定,本来想拿来主义更快,现在手头还在画简单的板,等到手了试一下,到时候有结果了再来回复,感谢大家回复,先谢了
作者: hack2800    时间: 2024-8-29 11:41
hcfat51h 发表于 2024-8-29 11:10
这个官方网站上有例程啊,稍微改一下就可以了.我自己运行过的,仿真器上测试3.4V,仿真结果是3424mV,这个误差 ...

厉害,我都不会用仿真器看仿真结果的电压,刚接触不久,平时只拿来简单烧程序,谢谢
作者: hack2800    时间: 2024-8-29 11:45
hcfat51h 发表于 2024-8-29 11:10
这个官方网站上有例程啊,稍微改一下就可以了.我自己运行过的,仿真器上测试3.4V,仿真结果是3424mV,这个误差 ...

哎,我对仿真器不熟,所以在画板等在上面跑效果
作者: hcfat51h    时间: 2024-8-29 14:08
hack2800 发表于 2024-8-29 11:45
哎,我对仿真器不熟,所以在画板等在上面跑效果

是用仿真器连接目标板才能运行的,我意思是供电也是仿真器提供的
作者: hcfat51h    时间: 2024-8-29 14:09
hack2800 发表于 2024-8-29 11:45
哎,我对仿真器不熟,所以在画板等在上面跑效果

可以上某一个宝买个SSOP20转插件的,然合随便用万用板搭电路
作者: hack2800    时间: 2024-8-29 14:39
你这个既然都仿真了,应该是最好的答案了,我自己要等得比较久,板还没画好,还要做板及先程序,先把分给了,感谢!
作者: 乐于助人    时间: 2024-8-29 15:23
1. FT61E145的ADC模块,AD值  = (AD通道电压 / 参考电压)* 4096;
2. FT61E145有内部1/4VDD通道,也就是这个AD通道是输入电压是VDD的四分之一(芯片内部用1比3电阻分压);
3. FT61E145的AD参考电压是可以选择内部固定基准电压,记得是0.5V/2V/3V三种可选;
4. 所以在1中的式子, AD值、参考电压(选择内部固定基准)、4096(12位ADC)是已知数,就可以推算出AD通道电压,这个AD通道电压乘以4,就是VDD电压了;
作者: 935107368    时间: 2024-8-29 20:13
两100K电阻分压测量AD值 3.7V/2/3V*4096
作者: hack2800    时间: 2024-8-29 23:58
hack2800 发表于 2024-8-29 11:45
哎,我对仿真器不熟,所以在画板等在上面跑效果

我还以为仿真器上什么都不用接,然后在软件里能看到仿真出来是多少电压
作者: hack2800    时间: 2024-8-29 23:58
hcfat51h 发表于 2024-8-29 14:09
可以上某一个宝买个SSOP20转插件的,然合随便用万用板搭电路

好,谢谢
作者: hack2800    时间: 2024-8-29 23:59
乐于助人 发表于 2024-8-29 15:23
1. FT61E145的ADC模块,AD值  = (AD通道电压 / 参考电压)* 4096;
2. FT61E145有内部1/4VDD通道,也就是 ...

感谢详细的讲解,谢谢大家
作者: hack2800    时间: 2024-8-29 23:59
935107368 发表于 2024-8-29 20:13
两100K电阻分压测量AD值 3.7V/2/3V*4096

恩恩,这种知道,谢谢




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1