C8051F352,ADC0求助

[复制链接]
 楼主| llfsunshine 发表于 2012-8-22 00:05 | 显示全部楼层 |阅读模式
本帖最后由 xlhtracy 于 2013-8-27 13:58 编辑

最近在做一个用C8051F352采集数据,通过AD0转换通过串口和pc通信的任务。遇到了问题,还望论坛中的大侠帮助。下面是原理图

下面是我写的AD0转换的代码,在ANI0.2输入,然后通过串口助手通信。

  1. #include <C8051F350.h>
  2. #include <stdio.h>

  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. //16位寄存器定义
  6. sfr16 TMR2RL = 0xCA; // 定时器2重装值
  7. sfr16 TMR2 = 0xCC; // 定时器2值
  8. sfr16 ADC0DEC = 0x9A; // ADC0 抽取比寄存器

  9. typedef union LONGDATA{ //共同体用于存放返回的ad值
  10. uint result ;
  11. uchar Byte[2] ;
  12. }LONGDATA;
  13. uchar flag=1;

  14. #define SYSCLK 24500000 // 系统时钟频率 Hz
  15. #define MDCLK 2457600 // 调制时钟分频数
  16. // (2.4576 MHz)
  17. #define OWR 20 // 输出字率 Hz
  18. #define BAUDRATE 9600 // 波特率

  19. void Oscillator_Init (void);
  20. void Port_Init (void);
  21. void UART0_Init (void);
  22. void ADC0_Init(void);
  23. void ADC0_Sigle_Channel_ISR(uchar Channel);

  24. void main(void)
  25. {

  26. static LONGDATA rawValue;
  27. uint mV;

  28. PCA0MD &= ~0x40;
  29. Oscillator_Init();
  30. Port_Init(); // 端口初始化
  31. UART0_Init(); // 串口通信初始化
  32. ADC0_Init(); // ADC0初始化
  33. while(1)
  34. {
  35. if(flag)
  36. {
  37. ADC0_Sigle_Channel_ISR(0x28);
  38. rawValue.Byte[0]=(uchar)ADC0H;
  39. rawValue.Byte[1]=(uchar)ADC0M;
  40. mV = rawValue.result / 26;
  41. printf("AIN0.2 voltage: %4d mV\n",mV);
  42. }
  43. }
  44. }

  45. void Oscillator_Init (void)
  46. {
  47. OSCICN = 0x83; // 内部晶振使能,SYSCLK不分频
  48. CLKSEL = 0x00; // 选择内部振荡器
  49. RSTSRC = 0x04; // 时钟丢失检验使能

  50. }

  51. void Port_Init (void)
  52. {
  53. XBR0 = 0x01; // UART0 TX0,RX0连接到引脚
  54. XBR1 = 0x40; // 交叉开关使能,弱上拉使能
  55. P0MDOUT |= 0x10; // TX 免推方式
  56. }

  57. void UART0_Init (void)
  58. {
  59. SCON0 = 0x10; // SCON0: 8位波特率可编程uart,
  60. // 停止位的逻辑电平被忽略
  61. // RX 使能
  62. // 第9位清零
  63. // RI0 ,TI0标志位清零
  64. if (SYSCLK/BAUDRATE/2/256 < 1) {
  65. TH1 = 256-(SYSCLK/BAUDRATE/2);
  66. CKCON &= ~0x0B;
  67. CKCON |= 0x08; // T1M = 1; SCA1:0 = xx
  68. } else if (SYSCLK/BAUDRATE/2/256 < 4) {
  69. TH1 = 256-(SYSCLK/BAUDRATE/2/4);
  70. CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 01
  71. CKCON |= 0x01;
  72. } else if (SYSCLK/BAUDRATE/2/256 < 12) {
  73. TH1 = 256-(SYSCLK/BAUDRATE/2/12);
  74. CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 00
  75. } else if (SYSCLK/BAUDRATE/2/256 < 48) {
  76. TH1 = 256-(SYSCLK/BAUDRATE/2/48);
  77. CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 10
  78. CKCON |= 0x02;
  79. } else {
  80. while (1); // Error. Unsupported baud rate
  81. }
  82. TL1 = TH1; // Init Timer1
  83. TMOD &= ~0xf0; // TMOD: timer1 8位自动重装
  84. TMOD |= 0x20;
  85. TR1 = 1; // 启动 Timer1
  86. TI0 = 1; // 表面 TX0 准备好了
  87. }

  88. void ADC0_Init (void)
  89. {
  90. ADC0MD = 0x80; //ADC0使能,工作在空闲模式
  91. REF0CN |= 0x03; // 使能内部 Vref
  92. ADC0CN = 0x00; // PGA增益为1,单极性工作方式
  93. ADC0CF = 0x00; // SINC3 滤波器输出,使用内部2.5V Vref

  94. ADC0CLK = (SYSCLK/MDCLK)-1; // 产生调制时钟分频系数
  95. // MDCLK = 2.4576MHz
  96. // 根据输出字率确定抽取比
  97. ADC0DEC = ((unsigned long) MDCLK / (unsigned long) OWR /(unsigned long) 128) - 1;
  98. ADC0BUF = 0x00; // 关闭输入缓冲器
  99. ADC0MUX = 0x28; // 选择 AIN0.2
  100. ADC0MD = 0x81; // 开始内部校准
  101. while(!AD0CALC); // 直到校准完成
  102. EIE1 &= ~0x08; // 关闭中断
  103. ADC0MD &= ~0x07; // 使ADC0处于空闲模式
  104. }

  105. void ADC0_Sigle_Channel_ISR(uchar Channel)
  106. {
  107. ADC0MUX = Channel; // 转换通道
  108. AD0INT = 0; // 清ADC0中断标志
  109. ADC0MD |= 0x02; // ADC0单次转换
  110. // AD0INT = 0; // 清ADC0中断标志
  111. while (!AD0INT);
  112. flag=0;
  113. }




但是很奇怪,运行时候,无论我输入怎么变,输出都是302mv


下面是我仿真时候的,ADC0寄存器的值。
我对照datasheet看了下,好像是ADC0STA寄存器中的AD0SC3置位了,表明ADC0 SINC3 滤波器发生了限幅。但是我不知道什么意思。也不知道怎么修改。还玩哪位大侠用过这个芯片的,帮我看看。或者发个正确的代码给我,小弟感激不尽。

原理图和ADC0寄存器在附近中。谢谢大家

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
tatata000 发表于 2013-8-27 13:49 | 显示全部楼层
不知道LZ这个问题现在解决了没有呢……
ayb_ice 发表于 2013-8-27 13:54 | 显示全部楼层
RT:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
ninicaoyuan 发表于 2015-4-28 18:09 | 显示全部楼层
呵呵,我的初始化一直有问题,但是参照了你的就改好了,谢谢
ninicaoyuan 发表于 2015-4-28 18:11 | 显示全部楼层
是我的问题是因为ADC0MD = 0x80; //ADC0使能,工作在空闲模式,这条的位置,还有抽取比的问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

3

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部