[求助]
这是关于LM3S328的ADC实验,请问程序有问题么
- #include
- void PLLSet()
- {
- unsigned long ulRCC,ulDelay;
- ulRCC=SYSCTL_RCC_R; //读取当前RCC寄存器的值
- ulRCC|=1<<11; //旁路PLL
- ulRCC&=~(1<<22); //不使用系统分频器
- SYSCTL_RCC_R=ulRCC;
- ulRCC=SYSCTL_RCC_R;
- ulRCC&=~(3<<4); //选择主振荡器做时钟
- ulRCC&=~(0xf<<6); //设置晶振频率
- ulRCC|=SYSCTL_RCC_XTAL_6MHZ;
- ulRCC&=~(0xf<<23); //设置分频系数
- ulRCC&=~(1<<13); //PLL上电
- ulRCC&=~(1<<12); //PLL使能输出
- SYSCTL_RCC_R=ulRCC; //写RCC寄存器
- for(ulDelay=32768;ulDelay>0;ulDelay--)
- {
- if(SYSCTL_RIS_R&(1<<6))
- {
- SYSCTL_MISC_R=1<<6; //清PLL锁定位
- break;
- }
- }
- SYSCTL_RCC_R|=1<<22; //使用系统分频器
- SYSCTL_RCC_R&=~(1<<11); //PLL输出到系统时钟
- }
- int main()
- {
- long ulData;
- PLLSet();
- SYSCTL_RCGC0_R|=SYSCTL_RCGC0_ADC; //0x00010000使能ADC模块的时钟
- SYSCTL_RCGC0_R|=SYSCTL_RCGC0_ADCSPD125K ; //0x00000000;125Kbps采样率
-
- SYSCTL_RCGC2_R |=SYSCTL_RCGC2_GPIOD; //1.使能LED所在管脚时钟
- GPIO_PORTD_DIR_R |= 0x01; //2.设置LED所在管脚为输出
- GPIO_PORTD_DEN_R |=0x01; //3.LED所在管脚数字使能*/
-
- ADC0_ACTSS_R =0x00000000; //禁止所有采样序列
- ADC0_SSPRI_R=0x00000000; //设置采样序列0为最高优先级
- ADC0_EMUX_R=0x00000000; //采样序列0为处理器触发
- ADC0_SSMUX0_R =0x00000000; //采样序列0的第0步使用ADC0
- ADC0_SSCTL0_R =0x00000002; //采样序列0采样完第0步后结束
- ADC0_ACTSS_R |=0x00000001; //使能采样序列0
- while(1)
- {
- ADC0_PSSI_R |=0x00000001; //处理器触发采样序列0
-
- while(ADC0_SSFSTAT0_R&0x00000100); //等待FIFO 0为非空,
- ulData=ADC0_SSFIFO0_R; //读出10位转换结果
- ulData=(ulData*1000*3)/1024; //换算成真实电压值
- if(ulData>2)
- GPIO_PORTD_DATA_R=0X01; //如果电压大于2,PD0输出高电平点亮LED
- }
- }
请各位帮我看看程序有没有问题,谢谢
[
本帖最后由 shmily53 于 2013-8-19 22:20 编辑 ]
-
回复 楼主shmily53 的帖子
没有看到对 ADC 所在的 AIN 管脚进行配置的代码
回复 沙发Study_Stellaris 的帖子
ADC0不是都已经配置好了么?加Q细聊759797452
回复 沙发Study_Stellaris 的帖子
ADC0_ACTSS_R =0x00000000; //禁止所有采样序列
ADC0_SSPRI_R=0x00000000; //设置采样序列0为最高优先级
ADC0_EMUX_R=0x00000000; //采样序列0为处理器触发
ADC0_SSMUX0_R =0x00000000; //采样序列0的第0步使用ADC0
ADC0_SSCTL0_R =0x00000002; //采样序列0采样完第0步后结束
ADC0_ACTSS_R |=0x00000001; //使能采样序列0
回复 4楼shmily53 的帖子
你配置的是 ADC 模块,需要配置 GPIO 管脚工作在 AIN 模式.
比如 GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_7);
AIN模式是?这个库函数是把某个管脚配置成ADC功能吧?能不能更具图具体说一下?还是不太理解。(使用的是ADC0)
回复 5楼Study_Stellaris 的帖子
能具体用实现下么,看仿真图
回复 7楼shmily53 的帖子
有 LM3S328 的数据手册吗?
你需要看一下 ADC0 到底是哪个 GPIO 管脚.
建议里用库函数吧,寄存器效率太低了,你本可将更多的时间用来学习其它的东西.
[ 本帖最后由 Study_Stellaris 于 2013-8-21 11:57 编辑 ]
回复 8楼Study_Stellaris 的帖子
这个库函数我也看过,有数据手册啊,但是我找遍了数据手册也没有关于ADC0 到底是哪个 GPIO 管脚。只是介绍了是模拟量输入管脚
不好意思,之前没看数据手册,我错了
这个型号的 ADC 就是默认的,不需要配置 GPIO.
不过我看数据手册上是 RCGC1 ,你的是 RCGC0
Enable the ADC clock by writing a value of 0x00010000 to the RCGC1 register in the System
Control module.
回复 10楼Study_Stellaris 的帖子
嗯嗯,非常感谢!其他地方没问题吧
虽然数据手册是RCGC1,但lm3s328.h中RCGC1没有关于ADC的使能0x00010000.而且改成RCGC1后,protues仿真既然出错Access to register of unclocked peripheral at 0x40038000 cause BUS_FAULT
ADC已经解决,共享给大家
-
ADC.zip
(2013-9-6 13:01 上传)
145.11 KB, 下载次数: 2