从参加抢LM3S811的活动后,每天都期待啊,终于在4.26的下午,顺风快递发来信息去取快递,其实已经料到是811到啦,好兴奋的跑到校门口外迎接顺风,领到包裹后,回寝室迫不及待的打开它,没错是811 。用811把我以前的LCD有重新驱动了起来,下面是我这几天学习811ADC部分的心得,Stellaris系列ARM 的 ADC 模块提供系列特性:
4 个模拟输入通道 ,可 配置 单端和差分输入, 内部温度传感器 ,高达500k/s 的采样率 ,4个可编程的采样转换序列, 入口长度1到8, 每个序列均带有相应的转换结果FIFO
灵活的触发控制:处理器(软件) 、定时器、模拟比较器、PWM、GPIO , 硬件可对多达 64 个采样值进行平均计算(牺牲速度换取精度) ,转换器采用内部的 3V参考电压
干脆就直接上程序
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "inc/hw_ints.h"
#include "driverlib/debug.h"
#include "driverlib/gpio.h"
#include "driverlib/sysctl.h"
#include "utils/uartstdio.h"
#include "MyFolder/ssd1963.h"
#include "MyFolder/color.h"
#include "MyFolder/imags.h"
#include "driverlib/adc.h"
#include "driverlib/interrupt.h"
#include "MyFolder/timer_x.h"
#include "driverlib/systick.h"
unsigned long TheSysClock;
unsigned long Flag; //ADC 转换结束的标志
//串口初始化
void uartInit()
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
GPIOPinConfigure(GPIO_PA0_U0RX);
GPIOPinConfigure(GPIO_PA1_U0TX);
GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
UARTStdioInit(0);
}
//ADC 初始化
void ADC_Init()
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC);// 使能ADC
SysCtlADCSpeedSet(SYSCTL_ADCSPEED_125KSPS); // 设置ADC 采样速率
ADCSequenceDisable(ADC_BASE,0); // 配置前先禁止采样序列
// 采样序列配置:ADC基址,采样序列编号,触发事件,采样优先级
ADCSequenceConfigure(ADC_BASE,0,ADC_TRIGGER_TIMER,0);
// ADC采样序列步进配置:ADC基址,采样序列0,步值,采样通道,我采用的是多通道采样,单通道采样类似
ADCSequenceStepConfigure(ADC_BASE, 0, 0, ADC_CTL_CH0);//采样ADC0
ADCSequenceStepConfigure(ADC_BASE, 0, 1, ADC_CTL_CH1);//采样ADC1
ADCSequenceStepConfigure(ADC_BASE, 0, 2, ADC_CTL_CH2);//采样ADC2
ADCSequenceStepConfigure(ADC_BASE, 0, 3, ADC_CTL_CH3 //第4步:采样ADC3后
|ADC_CTL_END //结束,并
| ADC_CTL_IE); // 申请中断
ADCSequenceEnable(ADC_BASE,0);// 使能采样序列
ADCIntEnable(ADC_BASE, 0);// 使能ADC 采样序列中断
IntEnable(INT_ADC0);//使能ADC 中断
IntMasterEnable();// 使能处理器中断
}
// ADC采样:
void ADC_Sample(unsigned long ulValue[])
{
while (!Flag); // 等待采样结束
Flag = 0; // 清除ADC采样结束标志
ADCSequenceDataGet(ADC_BASE, 0, ulValue);// 自动读取全部ADC结果
}
void main()
{
unsigned long Value[4],ulValue;
unsigned char i;
SysCtlClockSet(SYSCTL_USE_PLL | SYSCTL_OSC_MAIN\
|SYSCTL_SYSDIV_12|SYSCTL_XTAL_6MHZ); //时钟初始化:PLL,16.67MHz
TheSysClock= SysCtlClockGet();
uartInit();//串口初始化
ADC_Init();//ADC 初始化
timerInt();//定时器初始化
LCD_GPIOInt();//LCD PORT口初始化
LCD_ini(); //LCD初始化
LCDClearScreen(ClrGreen); //清屏
LCD_PutCHAR(100,80,"EEWORLD", ClrWhite,ClrGreen);
while(1)
{
i=0;
ADC_Sample(Value);
for(;i<4;i++)
{
ulValue=Value*3000/1024; // 转换成电压值
UARTprintf("ADC%d Voltage is:%d\n",i,ulValue);//串口输出
SysCtlDelay(1500*TheSysClock/3000);//延时约1500ms
}
}
}
void ADC_ISR(void)
{
unsigned long ulStatus;
ulStatus = ADCIntStatus(ADC_BASE, 0, true); // 读取中断状态
ADCIntClear(ADC_BASE, 0); // 清除中断状态,重要
if (ulStatus != 0) // 如果中断状态有效
{
Flag = true; // 置位ADC 采样结束标志
}
}
还在学习其他部分,待续
下面是通过串口显示的采样电压值
[
本帖最后由 zw357234798 于 2011-5-3 23:24 编辑 ]