如何使用STM8S单片机的多通道AD转换

来源:互联网 发布:全国省市区街道数据库 编辑:程序博客网 时间:2024/05/22 07:58

STM8S单片机的A/D结构简介:

   具有ADC1 ADC2(部分型号没有ADC2)最多提供16个转换通道,A/D转换的各个通道可以执行单次和连续的转换模式。

1.电压0到Vdda;

2.在64和80引脚封装的有独立的Vref,其他的封装形式Vref连接在Vdda

3.续转换形式;

4.时间14个时钟周期;

5.10位转换精度;

6.产生转换结束中断;

[转载]如何使用STM8S单片机的多通道AD转换

ADC1结构图

编程中注意的知识点:

    过置位ADC_CR1寄存器的 ADON位来开启ADC。当首次置位ADON位时,ADC从低功耗模式唤醒。为了启动转换必须第二次使用写指令来置ADC_CR1寄存器的ADON 位。在转换结束时ADC会保持在上电状态,用户只需要置位ADON位一次来启动下一次的转换。

    如果长时间没有使用ADC,推荐将ADC模块切换到低功耗模式来降低功耗,这可以通过清零 ADON 位来实现。ADC模块上电后,所选通道对应的I/O口输出模块是被禁用的。因此推荐在ADC上电之前要选择合适的ADC转换通道。

    如果单次模式在单次转换模式中,ADC仅在由ADC_CSR寄存器的CH[3:0]选定的通道上完成一次转换。该模式是在当CONT位为0时通过置位ADC_CR1寄存器的ADON位来启动的。

一旦转换完成,转换后的数据存储在ADC_DR寄存器中,EOC(转换结束)标志被置EOCIE 被置位将产生一个中断。

代码如下:

#include "adc.h"

 u16  TempADC;

void ADC_Config(void) 

{

    ADC_CR1 |= 0x01;    //开始启动初始化必须启动一次

                        //第一次写1,ADC从低功耗唤醒,第二次写1,启动ADC转换

   //ADC_CR1 |= 0x20; //使能转换结束中断,本例中采用的查询方式。

}

 

uint16_t Get_ADCCH_Value(ADC1_Channel_TypeDef ADC_Channel)

  ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS,ADC_Channel, ADC1_PRESSEL_FCPU_D2,

     ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_ALL, DISABLE);

    //你也可以用操作寄存器的方式代码如下,但未验证。

#if 0

ADC_CR2 = 0x00;             // A/D结果数据左对齐

CLK_PCKENR2 |= 0x08;        // 使能fMASTER与ADC的连接

ADC_CR1 = 0x00;// ADC时钟=主时钟/2=8MHz,单次转换模式

ADC_CSR = 0x01;             // 选择通道2

ADC_TDRL = 0x01;            // 禁止施密特触发功能 

ADC_TDRH = 0x01;

ADC_CR1 = 0x03; //2分频,连续转换,启动ADC

ADC_CR2 = 0x31; //外部事件保留,数据右对齐,禁止扫描模式,

ADC_CSR|= 0x01; //选择通道1

#endif

 ADC1_ConversionConfig(ADC1_CONVERSIONMODE_CONTINUOUS, ADC_Channel,ADC1_ALIGN_RIGHT);

 ADC1_Cmd(ENABLE);     //启动ADC

 while(ADC1_GetFlagStatus(ADC1_FLAG_EOC) == RESET);  //等待转换结束
 ADC1_ClearFlag(ADC1_FLAG_EOC);  //清除转换结束标志

// 下面注释掉的两句与上面三句作用一样

//     ADC_CR1 |= 0x01;      //开始启动转换

//     while(!(ADC_CSR & 0x80));   //等待转换结束

    return ADC1_GetConversionValue(); //返回ADC结果

}

//这个初始化代码很重要,不能省,每次切换通道都要初始化一次!

在main函数中直接调用即可:

  TempADC=Get_ADCCH_Value(ADC1_CHANNEL_1); //获取AD转化值

  WetADC=Get_ADCCH_Value(ADC1_CHANNEL_3; //获取AD转化值

 

 到此结束!开始你的代码快乐之旅吧~~~~


转自:http://blog.sina.com.cn/s/blog_615ec1630101kf08.html


原创粉丝点击