[求助] 这是关于LM3S328的ADC实验,请问程序有问题么

shmily53   2013-8-19 22:16 楼主
  1. #include
  2. void PLLSet()
  3. {
  4.         unsigned long ulRCC,ulDelay;
  5.         ulRCC=SYSCTL_RCC_R;               //读取当前RCC寄存器的值
  6.         ulRCC|=1<<11;                     //旁路PLL
  7.         ulRCC&=~(1<<22);                  //不使用系统分频器
  8.         SYSCTL_RCC_R=ulRCC;
  9.         ulRCC=SYSCTL_RCC_R;
  10.         ulRCC&=~(3<<4);              //选择主振荡器做时钟
  11.         ulRCC&=~(0xf<<6);  //设置晶振频率
  12.         ulRCC|=SYSCTL_RCC_XTAL_6MHZ;   
  13.         ulRCC&=~(0xf<<23);    //设置分频系数
  14.         ulRCC&=~(1<<13);   //PLL上电
  15.         ulRCC&=~(1<<12);        //PLL使能输出
  16.         SYSCTL_RCC_R=ulRCC;    //写RCC寄存器
  17.         for(ulDelay=32768;ulDelay>0;ulDelay--)
  18.         {
  19.                 if(SYSCTL_RIS_R&(1<<6))
  20.                 {
  21.                         SYSCTL_MISC_R=1<<6;   //清PLL锁定位
  22.                         break;
  23.                 }
  24.         }
  25.         SYSCTL_RCC_R|=1<<22;         //使用系统分频器
  26.         SYSCTL_RCC_R&=~(1<<11);      //PLL输出到系统时钟        
  27. }
  28. int main()
  29. {
  30.          long ulData;
  31.         PLLSet();
  32.         SYSCTL_RCGC0_R|=SYSCTL_RCGC0_ADC;  //0x00010000使能ADC模块的时钟
  33.         SYSCTL_RCGC0_R|=SYSCTL_RCGC0_ADCSPD125K ; //0x00000000;125Kbps采样率
  34.         
  35.         SYSCTL_RCGC2_R |=SYSCTL_RCGC2_GPIOD;   //1.使能LED所在管脚时钟
  36.         GPIO_PORTD_DIR_R |= 0x01;             //2.设置LED所在管脚为输出
  37.         GPIO_PORTD_DEN_R |=0x01;              //3.LED所在管脚数字使能*/
  38.         
  39.         ADC0_ACTSS_R =0x00000000;     //禁止所有采样序列
  40.         ADC0_SSPRI_R=0x00000000;      //设置采样序列0为最高优先级
  41.         ADC0_EMUX_R=0x00000000;       //采样序列0为处理器触发
  42.         ADC0_SSMUX0_R =0x00000000;     //采样序列0的第0步使用ADC0
  43.         ADC0_SSCTL0_R =0x00000002;     //采样序列0采样完第0步后结束
  44.         ADC0_ACTSS_R |=0x00000001;    //使能采样序列0
  45.         while(1)
  46.         {
  47.                 ADC0_PSSI_R |=0x00000001;    //处理器触发采样序列0
  48.                
  49.                 while(ADC0_SSFSTAT0_R&0x00000100); //等待FIFO 0为非空,
  50.                 ulData=ADC0_SSFIFO0_R;   //读出10位转换结果
  51.                 ulData=(ulData*1000*3)/1024;  //换算成真实电压值
  52.                 if(ulData>2)
  53.                         GPIO_PORTD_DATA_R=0X01;    //如果电压大于2,PD0输出高电平点亮LED
  54.         }
  55. }
请各位帮我看看程序有没有问题,谢谢

[ 本帖最后由 shmily53 于 2013-8-19 22:20 编辑 ]
  • 软件仿真显示,ADC时钟为16.67MHz,符合要求

回复评论 (14)

回复 楼主shmily53 的帖子

没有看到对 ADC 所在的 AIN 管脚进行配置的代码
点赞  2013-8-20 10:02

回复 沙发Study_Stellaris 的帖子

ADC0不是都已经配置好了么?加Q细聊759797452
点赞  2013-8-20 14:22

回复 沙发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
点赞  2013-8-20 14:24

回复 4楼shmily53 的帖子

你配置的是 ADC 模块,需要配置 GPIO 管脚工作在 AIN 模式.
比如    GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_7);
点赞  2013-8-20 16:29
AIN模式是?这个库函数是把某个管脚配置成ADC功能吧?能不能更具图具体说一下?还是不太理解。(使用的是ADC0)
  • ADC1.png
点赞  2013-8-20 18:48

回复 5楼Study_Stellaris 的帖子

能具体用实现下么,看仿真图
点赞  2013-8-20 18:49

回复 7楼shmily53 的帖子

有 LM3S328 的数据手册吗?
你需要看一下 ADC0 到底是哪个 GPIO 管脚.
建议里用库函数吧,寄存器效率太低了,你本可将更多的时间用来学习其它的东西.

[ 本帖最后由 Study_Stellaris 于 2013-8-21 11:57 编辑 ]
点赞  2013-8-21 08:42

回复 8楼Study_Stellaris 的帖子

这个库函数我也看过,有数据手册啊,但是我找遍了数据手册也没有关于ADC0 到底是哪个 GPIO 管脚。只是介绍了是模拟量输入管脚
点赞  2013-8-21 10:57
不好意思,之前没看数据手册,我错了
这个型号的 ADC 就是默认的,不需要配置 GPIO.
不过我看数据手册上是 RCGC1 ,你的是 RCGC0
Enable the ADC clock by writing a value of 0x00010000 to the RCGC1 register in the System
Control module.
点赞  2013-8-21 12:05

回复 10楼Study_Stellaris 的帖子

嗯嗯,非常感谢!其他地方没问题吧
点赞  2013-8-21 20:04
虽然数据手册是RCGC1,但lm3s328.h中RCGC1没有关于ADC的使能0x00010000.而且改成RCGC1后,protues仿真既然出错Access to register of unclocked peripheral at 0x40038000 cause BUS_FAULT
  • LM3S.png
点赞  2013-8-21 20:25
ADC已经解决,共享给大家

    ADC.zip (2013-9-6 13:01 上传)

    145.11 KB, 下载次数: 2

点赞  2013-9-6 13:01
引用: shmily53 发表于 2013-8-21 20:25 虽然数据手册是RCGC1,但lm3s328.h中RCGC1没有关于ADC的使能0x00010000.而且改成RCGC1后,protues仿真既然 ...

能请问一下这个问题是怎么解决的嘛,谢谢

点赞  2019-7-7 15:53
引用: shmily53 发表于 2013-9-6 13:01 ADC已经解决,共享给大家

不错,谢谢,分享。

点赞  2019-7-9 10:06
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复