我是一个新手,调试完了基本的LED.中断。定时器。最近在调ADC。可是有些地方就是想不明白。在看别人的例程时,根本就没有看到定义哪个端口是AD采集端口。看了《LM3S系列模-数转换器(ADC).pdf》也没有看明白,还请高人指点下。
程序里 “”“采样步进设置:ADC基址,采样序列编号,步值,通道设置 ”“”中选的是“ADC_CTL_CH0”输入通道0,对应是的“ADC0”,我找到我所用的芯片的原理图“ADC0”就是“PE7”.我把外部电压引到PE7引脚上。可是采到的值是“0”我不知道是哪里错了。
回复 楼主 fendou 的帖子
从初始化来看,没有问题,接到 PE7 也没有问题。
检查是否调用了触发 ADC 采样的 API.
回复 沙发 Study_Stellaris 的帖子
// 主函数(程序入口)
int main(void)
{
unsigned long ulValue;
//jtagWait(); // 防止JTAG失效,重要!
clockInit(); // 时钟初始化:16M外部晶振
adcInit(); // ADC初始化
for (;;)
{
ADCProcessorTrigger(ADC_BASE, 0); // 处理器触发采样序列
while (!ADC_EndFlag); // 等待采样结束
ADC_EndFlag = false; // 清除ADC采样结束标志
ADCSequDataGet(ADC_BASE, 0, &ulValue);
ulValue = (ulValue * 3000) / 1024;
//SysCtlDelay(1500 * (TheSysClock / 3000)); // 延时约1500ms
}
}
// ADC采样序列0的中断
void ADC_Sequence_0_ISR(void)
{
unsigned long ulStatus;
ulStatus = ADCIntStatus(ADC_BASE, 0, true); // 读取中断状态
ADCIntClear(ADC_BASE, 0); // 清除中断状态,重要
if (ulStatus != 0) // 如果中断状态有效
{
ADC_EndFlag = true; // 置位ADC采样结束标志
}
}
//系统时钟
void clockInit(void)
{
SysCtlLDOSet(SYSCTL_LDO_2_50V); // 设置LDO输出电压
SysCtlClockSet(SYSCTL_USE_OSC | // 系统时钟设置
SYSCTL_OSC_MAIN | // 采用主振荡器
SYSCTL_XTAL_16MHZ | // 外接6MHz晶振
SYSCTL_SYSDIV_1); // 不分频
}
我是这么写的。难道不行吗?
回复 4楼 fendou 的帖子
用的哪一颗,晶振是多少?
回复 5楼 Study_Stellaris 的帖子
9B96 ,晶振16M
回复 5楼 Study_Stellaris 的帖子
你说既然程序能进“ADC_Sequence_0_ISR”中断,是不是代表AD转换结束,把采样值放到相应的FIFO里了?
回复 7楼 fendou 的帖子
9B96 可以参考 StellarisWare example 中的 ADC 例程。
好像没看到设置PE7为ADC功能哦
/* Set the pin as AD input */
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_7);
回复 10楼 brucege888 的帖子
是的。我重新参考了StellarisWare example 中的 ADC 例程修改了程序,就行了。但是,我觉得上面那样写应该也没有错,因为我看了很多人的代码,大部分都是那么写的。不知道怎么回事。
回复 11楼 fendou 的帖子
周立功提供的例程似乎都没有使能AD引脚,不过我十分怀疑能否正常运行。我在自己的程序里面不使能AD引脚后,运行的结果都是错误的。。。。
回复 12楼 brucege888 的帖子
使能应该在ADC采样序列里面。不太懂。也没有个高手说下。唉
回复 13楼 fendou 的帖子
gpio口不配置,光使能模块,是采不到数值啊