找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STM8L151实现AD测量程序_寄存器版调试成功

[复制链接]
跳转到指定楼层
楼主
ID:600674 发表于 2019-8-16 11:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "ADC.h"
#include "iostm8l151f2.h"
#include "stdbool.h"
#include "stdint.h"
uint16_t Vbat1=0;
uint16_t Vbat0=0;
uint16_t Vusbin=0;
uint16_t Vbutton0=0;
uint16_t Vbat=0;
static uint16_t temp=0;

void delay_500ms(void)    //粗略延时程序

{

  uint16_t i,j;

  for(i=0;i<1000;i++)//2*1000个指令周期

    for(j=0;j<500;j++);//2*500个指令周期

  //1000*2*500+2*500=1.001M,延迟1/16s=62.5ms

  //16M 一个指令周期为1/16us

}

void ADC1_Init()
{

   CLK_PCKENR2_PCKEN20=1; //开启ADC1外设时钟

   ADC1_CR1_ADON=1;  //wakes up the ADC from Power down mode

   ADC1_CR1_CONT=0; //单次转换模式

   ADC1_CR2_PRESC=1;//Select a sample time of 1μs  //   0: f(ADC_CLK) = CK

                     //   1: f(ADC_CLK) = CK/2  //系统时钟此时为默认的16M/8=2M,这里分频后,fadc=2M/2=1M

   ADC1_SQR1_DMAOFF=1;    //关闭DMA通道

   //ADC1_CR3_SMTP2=0x06;  //设置内部参考电压通道的采样时间

   ADC1_CR2_SMTP1=0x03;//外部0-23通道的采样时间为24 ADC clock cycles,也就是24*1us=24us


//  ADC1_CR1_EOCIE=1; //中断

}
//#pragma vector=COMP_EF2_vector

//__interrupt void ADC1_ISR(void

//测量VDD
uint16_t get_VDD()
{
   Vbat=0;

   ADC1_SQR1_CHSEL_S28=1;  //选择ADC通道28,内部参考电压通道

   ADC1_TRIGR1_VREFINTON=1;//打开内部参考电压源1.225v


   for(char j=0;j<10;j++)
    {

        ADC1_CR1_START=1 ;//开始转换
        while(!(ADC1_SR_EOC==1));//等待转换结束,清除标志位
        temp = ADC1_DRH;
        temp = (temp<<8)+ADC1_DRL;
        temp=(uint32_t)2400*4096/temp;   //由于VREF与VDD接在同一引脚上,内部参考电压输出通道实际电压不知,
                                        //因此无法采用内部参考电压测量VDD,用电压表多点测量的方法测得实际VDD=1.790V
        Vbat+=temp;
    }   
   Vbat = Vbat/10;

   asm("nop");

   ADC1_SQR1_CHSEL_S28=0; //关闭通道

   return Vbat;


}

uint16_t get_Vbat1()
{
   Vbat1=0;

   static uint16_t temp1=0;

   ADC1_SQR3_CHSEL_S11=1;  //选择ADC通道11

   ADC1_TRIGR3_TRIG11=1;  //关闭通道11的施密特触发器

   for(char j=0;j<10;j++)
    {

        ADC1_CR1_START=1 ;//开始转换
        while(!(ADC1_SR_EOC==1));
        temp1 = ADC1_DRH;
        temp1 = (temp1<<8)+ADC1_DRL;
        temp1=(uint32_t)1800*temp1/4096;   

        Vbat1+=temp1;
    }   
    Vbat1 = Vbat1/10;

    Vbat1=3*Vbat1;//实际电压值为3倍的AD电压值

    ADC1_SQR3_CHSEL_S11=0;
   asm("nop");
     return Vbat1;

}

uint16_t get_Vbat0()
{
   Vbat0=0;

   static uint16_t temp0=0;

   ADC1_SQR3_CHSEL_S12=1;  //打开ADC通道12

   ADC1_TRIGR3_TRIG12=1;  //关闭通道12的施密特触发器

  for(char k=0;k<10;k++)
    {
        ADC1_CR1_START=1 ;//开始转换
        while(!(ADC1_SR_EOC==1));
        temp0 = ADC1_DRH;
        temp0 = (temp0<<8)+ADC1_DRL;
        temp0=(uint32_t)1800*temp0/4096;
        Vbat0+=temp0;
    }

    Vbat0 = Vbat0/10;

    Vbat0=3*Vbat0;
     asm("nop");
      ADC1_SQR3_CHSEL_S12=0;

     return Vbat0;

}

uint16_t get_Vusbin()

{

   Vusbin=0;

   static uint16_t temp2=0;

   ADC1_SQR4_CHSEL_S4=1;  //打开ADC通道4

   ADC1_TRIGR4_TRIG4=1;  //关闭通道4的施密特触发器

  for(char k=0;k<10;k++)
    {
        ADC1_CR1_START=1 ;//开始转换

        while(!(ADC1_SR_EOC==1));//等待转换完成

        temp2 = ADC1_DRH;   //先存MSB

        temp2 = (temp2<<8)+ADC1_DRL; //(MSB)*256+LSB

        temp2=(uint32_t)1800*temp2/4096;  //   VDD/4096=Vx/AD值

        Vusbin+=temp2;
    }

      Vusbin = Vusbin/10;

      Vusbin =3*Vusbin;//USB输入电压
      asm("nop");

     ADC1_SQR4_CHSEL_S4=0;

     return Vusbin;

}

uint16_t get_Vbutton0()
{

     Vbutton0=0;

   static uint16_t temp3=0;

   ADC1_SQR3_CHSEL_S13=1;  //打开ADC通道13

   ADC1_TRIGR3_TRIG13=1;  //关闭通道13的施密特触发器

  for(char k=0;k<10;k++)
    {
        ADC1_CR1_START=1 ;//开始转换
        while(!(ADC1_SR_EOC==1));
        temp3= ADC1_DRH;
        temp3 = (temp3<<8)+ADC1_DRL;
        temp3=(uint32_t)1800*temp3/4096;
        Vbutton0+=temp3;
    }

        Vbutton0 =Vbutton0/10;  //button0对应的电压值
        asm("nop");
        ADC1_SQR3_CHSEL_S13=0; //关闭通道
        return Vbutton0;


}


/*
void main()
{
  // CLK_Init();
  ADC1_Init();

  delay_500ms();

  delay_500ms();

  delay_500ms();//延时等待ADC稳定之后再进行转换,能够准确读取对应通道的电压

  get_Vusbin();

  delay_500ms();

  delay_500ms();

  get_Vbat0();

  delay_500ms();

  get_Vbutton0();

  delay_500ms();

  get_Vbat1();

while(1)
{

}

}
*/










评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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