这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » LM3S811学习笔记(ADC)

共2条 1/1 1 跳转至

LM3S811学习笔记(ADC)

高工
2012-11-10 16:37:46     打赏

实验内容:使用ADC模块检测电压,并通过串口将检测到的电压传到上位机
实验目的:掌握A/D的使用方法

#include "inc\hw_memmap.h"
#include "inc\hw_ints.h"
#include "inc\hw_types.h"
#include "driverlib\sysctl.h"
#include "driverlib\gpio.h"
#include "driverlib\interrupt.h"
#include "driverlib\uart.h"
#include "driverlib\comp.h"
#include "driverlib\adc.h"
#include "type.h"
#include "bsp.h"
void ProtectJTAG(void)

  SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
  GPIOPadConfigSet(GPIO_PORTC_BASE, GPIO_PIN_4, GPIO_STRENGTH_2MA,  GPIO_PIN_TYPE_STD_WPU);//2MA驱动能力,推挽方式 弱上拉
    while(GPIOPinRead(GPIO_PORTC_BASE, GPIO_PIN_4) == 1)//有改动9:36
  { ;
  } 
}

void Bsp_Init(void)
{
   ProtectJTAG();    
   SysCtlClockSet( SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |
                    SYSCTL_XTAL_6MHZ );
}

void Delay(void)  //100Ms
{
  unsigned long i,j;
 
  for(i=0;i<10;i++)
  {
    for(j=500000;j>0;j--);
  }
}

void UARTInit(void) //串口初始化
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);//使能外设A端口R/T
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); //使能串口外设
GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); //使能串口GPIO脚
//UART配置 UART0 串口时钟为系统时钟 波特率9600 8位数据位 1位停止位 无奇偶校验
UARTConfigSetExpClk(UART0_BASE, SysCtlClockGet(), 9600,(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |UART_CONFIG_PAR_NONE));
UARTEnable(UART0_BASE); //使能串口(uart0) 发送和接收
}

void UARTSend(unsigned char str) //串口发送一个字符
{
if(UARTSpaceAvail(UART0_BASE))
{
UARTCharPutNonBlocking(UART0_BASE, str); //成功发送则返回true;若FIFO中没有可用空间则返回False,稍后再次尝试。P212
}
}

void Adc_Init(void) //模数转换器初始化
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC);//使能ADC时钟
SysCtlADCSpeedSet(SYSCTL_ADCSPEED_125KSPS);//P175 设置ADC采样速率

ADCSequenceDisable(ADC_BASE, 0);// 配置前先禁止采样序列
// //ADCProcessorTrigger(ADC_BASE,3);//引发一次采样序列的处理器触发
// /*如果采样序列触发被配置成ADC_TRIGGER_PROCESSOR,
// 这个函数就触发一次处理器启动的采样序列。*/
ADCSequenceConfigure(ADC_BASE,0,ADC_TRIGGER_PROCESSOR,0);//配置采样序列的触发源和优先级
ADCSequenceStepConfigure(ADC_BASE,0,0,ADC_CTL_CH0|ADC_CTL_IE|ADC_CTL_END);
//ADC3 步进0,完成采样后,步进完成时产生一个中断,通道0(ADC0)
ADCIntEnable(ADC_BASE,0); //使能采样序列编号3中断
IntEnable(INT_ADC0);
IntMasterEnable();
ADCSequenceEnable(ADC_BASE,0); //采样使能
}

void ADC0_ISR(void) //模数转化器中断处理函数
{
while(!ADCIntStatus(ADC_BASE, 0, false));//等待转换完成,(转换完成产生中断)
ADCIntClear(ADC_BASE,0);//清除采样序列中断源

unsigned long ADC0_Value;
ADCSequenceDataGet(ADC_BASE, 0, &ADC0_Value);//获取取一个采样序列捕获的数据
ADC0_Value=ADC0_Value*3000/1024; //由参考电压计算出实际所测电压(MV)
ADC0_Value=ADC0_Value*3+350; //计算出电源电压值(mv)

ADC0_Value=(ADC0_Value%10000)/1000; //取整数部分
unsigned char ADC0=ADC0_Value;
UARTSend(ADC0);

Delay();Delay();Delay();Delay();Delay();//延时0.5s

unsigned char ADC00=ADC0_Value;
ADC00=(ADC0_Value%1000)/100; //取小数部分
UARTSend(ADC00);
}
//主函数内实现触发一次模数转换,将转换后的值的整数和小数部分分别传到上位机
void main(void)
{
Bsp_Init();
UARTInit();
Adc_Init();
ADCProcessorTrigger(ADC_BASE,0);//引发一次采样序列的处理器触发
while(1)
{
}
}
小结:
模数转换器 (ADC) 外设用于将连续的模拟电压转换成离散的数字量。
该Stellaris® ADC模块的转换分辨率为10-位,并支持4个输入通道,以及一个内部温度传感器。 ADC模块含有一个可编程的序列发生器,它可在无需控制器干涉的情况下对多个模拟输入源进行采样。每个采样序列均对完全可配置的输入源、触发事件、中断的产生和序列优先级提供灵活的编程。
ADC支持高达8个输入通道和一个内部温度传感器。4个采样序列,每个都具有可配置的触发事件,可以被捕获。第一个序列将捕获多达8次采样,第二和第三个序列将捕获多达4次采样,第四个序列将捕获一次采样。每次采样的可以是相同的通道、不同的通道,或者任何顺序的通道组合。
该Stellaris® ADC 提供下列的特性:
■ 4个 模拟输入通道
■ 单端和差分输入配置
■ 内部温度传感器
■ 500,000 次/秒的采样率
■ 4个可编程的采样转换序列,入口长度1到8,每个序列均带有相应的转换结果FIFO
■ 灵活的触发控制
– 控制器(软件)
– 定时器
– 模拟比较器
– PWM
– GPIO
■ 硬件可对多达64个采样值进行平均计算,以便提高精度




关键词: LM3S811     学习     笔记     #include     采样    

院士
2012-11-11 11:44:54     打赏
2楼
学习了。
楼主 最后那个64个采样值求平均,是硬件计算,还是需要软件代码里处理啊

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]