找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC15W408AS单片机4-20mA(SPI4通道采集)内部电压采集程序

  [复制链接]
跳转到指定楼层
楼主
STC15W408AS-4-20mA(SPI4通道采集)+内部电压采集程序  实际项目用。
Project STC15W408AS_6soft_uart3(读内部参考BandGap-模拟串口发送)
电路原理图如下:


STC15W408AS测试内部BandGap参考电压:


单片机源程序如下:
  1. #include        "config.h"
  2. #include        "adc.h"
  3. #include        "delay.h"
  4. #include        "soft_uart.h"

  5. #define P1n_pure_input(bitn)                P1M1 |=  (bitn),        P1M0 &= ~(bitn)

  6. /*************        功能说明        **************

  7. 本程序演示多路ADC查询采样,通过模拟串口发送给上位机,波特率9600,8,n,1。
  8. 用户可以修改为1~8路的ADC转换。

  9. 说明:
  10.     ADC的第9通道是用来测试内部BandGap参考电压的,由于内部BandGap参考电
  11. 压很稳定,不会随芯片的工作电压的改变而变化,所以可以通过测量内部BandGap
  12. 参考电压,然后通过ADC的值便可反推出VCC的电压,从而用户可以实现自己的低
  13. 压检测功能.
  14.     ADC的第9通道的测量方法:首先将P1ASF初始化为0,即关闭所有P1口的模拟功能
  15. 然后通过正常的ADC转换的方法读取第0通道的值,即可通过ADC的第9通道读取当前
  16. 内部BandGap参考电压值.
  17.     用户实现自己的低压检测功能的实现方法:首先用户需要在VCC很精准的情况下
  18. (比如5.0V),测量出内部BandGap参考电压的ADC转换值(比如为BGV5),并这个值保存
  19. 到EEPROM中,然后在低压检测的代码中,在实际VCC变化后,所测量出的内部BandGap
  20. 参考电压的ADC转换值(比如为BGVx),通过计算公式: 实际VCC = 5.0V * BGV5 / BGVx,
  21. 即可计算出实际的VCC电压值,需要注意的是,第一步的BGV5的基准测量一定要精确.

  22. 标定内部基准Vref, 提供一个稳定的工作电压Vcc, 读内部基准Nref, 计算内部基准 Vref = Nref * Vcc / 1024.

  23. 测量某个电压, 读ADC值Nx, 则电压 Ux = Vref * Nx / Nref. 一般Vref = 1220mV.


  24. ******************************************/

  25. /*************        本地常量声明        **************/


  26. /*************        本地变量声明        **************/
  27. u16        Nref;


  28. /*************        本地函数声明        **************/



  29. /*************  外部函数和变量声明 *****************/


  30. void        ADC_config(void)
  31. {
  32.         ADC_InitTypeDef                ADC_InitStructure;                                //结构定义
  33.         ADC_InitStructure.ADC_Px        = ADC_P10 | ADC_P11 | ADC_P12;        //设置要做ADC的IO,        ADC_P10 ~ ADC_P17(或操作),ADC_P1_All
  34.         ADC_InitStructure.ADC_Speed     = ADC_360T;                        //ADC速度                        ADC_90T,ADC_180T,ADC_360T,ADC_540T
  35.         ADC_InitStructure.ADC_Power     = ENABLE;                        //ADC功率允许/关闭        ENABLE,DISABLE
  36.         ADC_InitStructure.ADC_AdjResult = ADC_RES_H8L2;                //ADC结果调整,        ADC_RES_H2L8,ADC_RES_H8L2
  37.         ADC_InitStructure.ADC_Polity    = PolityLow;                //优先级设置        PolityHigh,PolityLow
  38.         ADC_InitStructure.ADC_Interrupt = DISABLE;                        //中断允许                ENABLE,DISABLE
  39.         ADC_Inilize(&ADC_InitStructure);                                        //初始化
  40.         ADC_PowerControl(ENABLE);                                                        //单独的ADC电源操作函数, ENABLE或DISABLE

  41.         P1n_pure_input(0x07);        //把ADC口设置为高阻输入
  42. }



  43. /**********************************************/
  44. void main(void)
  45. {
  46.         u8        i;
  47.         u16        j;
  48. //        u8        k;

  49.         ADC_config();

  50.         while (1)
  51.         {
  52.                 for(i=0; i<4; i++)
  53.                 {
  54.                         delay_ms(250);                //为了让发送的速度慢一点,延时250ms

  55.                         if(i <3)        //ADC0~ADC2
  56.                         {
  57.                                 j = Get_ADC10bitResult(i);        //参数0~7,查询方式做一次ADC, 返回值就是结果, == 1024 为错误
  58.                                 TxSend('A');
  59.                                 TxSend('D');
  60.                                 TxSend(i+'0');
  61.                         }
  62.                         else                //内基准
  63.                         {
  64.                                 P1ASF = 0;
  65.                                 j = Get_ADC10bitResult(0);        //读内部基准电压, P1ASF=0, 读0通道
  66.                                 P1ASF = ADC_P10 | ADC_P11 | ADC_P12;
  67.                                 Nref = j;
  68.                                 TxSend('A');
  69.                                 TxSend('D');
  70.                                 TxSend('r');
  71.                                 TxSend('e');
  72.                                 TxSend('f');
  73.                         }
  74.                         TxSend('=');
  75.                         TxSend(j/1000 + '0');
  76.                         TxSend(j%1000/100 + '0');
  77.                         TxSend(j%100/10 + '0');
  78.                         TxSend(j%10 + '0');
  79.                         TxSend(' ');
  80.                         TxSend(' ');

  81.                         TxSend('V');
  82.                         TxSend('=');
  83.                         j = (u32)1250 * (u32)j / Nref;                        //Ux = Vref * Nx / Nref. Vref = 1250mV
  84.                         TxSend(j/1000 + '0');
  85.                         TxSend('.');
  86.                         TxSend(j%1000/100 + '0');
  87.                         TxSend(j%100/10 + '0');
  88.                         TxSend(j%10 + '0');
  89.                         TxSend(' ');
  90.                         TxSend(' ');
  91.                 }
  92.                 PrintString("\r\n");
  93.                 //=====================================================================
  94.         }
  95. }
复制代码


所有资料51hei提供下载:
原理图STC15W408_V1.0 程序.zip (711.84 KB, 下载次数: 162)
原理图STC15W408_V1.0.pdf (513.11 KB, 下载次数: 131)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:97678 发表于 2022-11-9 18:26 | 只看该作者
怎么感觉程序和原理图不一致。
回复

使用道具 举报

板凳
ID:168165 发表于 2023-2-23 23:35 | 只看该作者
我用仿真测试好像你原理图里面的运放模拟量输入输出并不是线性的
回复

使用道具 举报

地板
ID:115923 发表于 2023-11-23 09:03 | 只看该作者
程序和原理图不一致。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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