查看: 3752|回复: 7

[求助] PIT +ADC,代码麻烦高手看看问题在哪里,谢谢!!

[复制链接]

该用户从未签到

6

主题

24

帖子

0

新手上路

Rank: 1

积分
46
最后登录
1970-1-1
发表于 2013-6-28 08:10:48 | 显示全部楼层 |阅读模式
/*
 * File:  test.c
 * Purpose:  Main process
 *
 */
#include "common.h"
#include "start.h"
#include "freedom_gpio.h"
#ifdef CMSIS
#include "start.h"
#endif
void trigger_adc(void);
void adc_init(void);
void ADC0_IRQHandler(void);
/********************************************************************/
void PIT_IRQHandler(void)
{
  PIT_TFLG0 |= PIT_TFLG_TIF_MASK;
  trigger_adc(); 
  LED2_ON;
   out_char('B');
}
void pit_init(void)
{
  disable_irq(INT_PIT-16);
 
  //SIM_SCGC6
  SIM_SCGC6 |= SIM_SCGC6_PIT_MASK;         //enable PIT
 
  //PIT
    PIT_MCR  &= ~(PIT_MCR_MDIS_MASK | PIT_MCR_FRZ_MASK );   
  PIT_LDVAL0 = 0x1234000; 
  PIT_TFLG0 |=PIT_TFLG_TIF_MASK; 
    PIT_TCTRL0  |= ( PIT_TCTRL_TEN_MASK | PIT_TCTRL_TIE_MASK );
 
  enable_irq(INT_PIT-16);
}
 void adc_init(void)
{
    printf("adc_init  begin");
   //SIM_SCGC6
 //   SIM_SCGC6 |= SIM_SCGC6_ADC0_MASK;    // enable ADC0 clock
    //ADC0
  ADC0_SC1A = ADC_SC1_ADCH(0)|           //AD0
     ADC_SC1_AIEN_MASK;          //interupt enable   
    ADC0_CFG1 = ADC_CFG1_ADIV(2)|   //select divide is 2
     ADC_CFG1_MODE(1)|
                   ADC_CFG1_ADLSMP_MASK|
     ADC_CFG1_ADICLK(1);  //select bus/2 as clock source
 
   ADC0_SC2 = ~ADC_SC2_ADTRG_MASK;  //software trigger
  // add this
  enable_irq(15);//ADC0
  printf("adc_init  end");
}
void trigger_adc(void)
{
   //SIM_SCGC6
   SIM_SCGC6 |= SIM_SCGC6_ADC0_MASK;    // enable ADC0 clock
 
     //ADC0
  ADC0_SC1A = ADC_SC1_ADCH(0)|           //AD0
     ADC_SC1_AIEN_MASK;          //interupt enable  
}
unsigned int ReadADCPoll(void)
{
    printf("\n----ReadADCPoll--1--\n");
    while((ADC0_SC1A & ADC_SC1_COCO_MASK) == 0);  //????? coco can not be set to 1 and why????
    //ADC0_SC1A &= ~ ADC0_SC1A_COCO_MASK;
    printf("\n----ReadADCPoll--2--\n");
    return ADC0_RA;
}
void ADC0_IRQHandler(void)
{
 LED2_ON;
  printf("\n---ADC0_IRQHandler ADC sample data: %x.\n", ADC0_RA);
}

int main (void)

 gpio_init();
 pit_init();
 adc_init();
 
 while(1)
 {
  out_char('A');//???
  trigger_adc();
  printf("%d",ReadADCPoll());
  LED2_OFF;
 }
}
/********************************************************************/
 
 
上述代码主要意图:
PIT通过定时中断来触发ADC实现指定采样率的采样工作.
当前问题:
1IT中断服务不能进入,注释掉ADC相关代码可以进入该服务,但是一直停留在该服务中.
2:ADC的COCO标志不能正确置1,可能是ADC没有启动,ADC的中断服务程序也没有进入;
 
以上,麻烦高手指点下,不甚感激!!
我知道答案 目前已有6人回答
回复

使用道具 举报

该用户从未签到

6

主题

24

帖子

0

新手上路

Rank: 1

积分
46
最后登录
1970-1-1
 楼主| 发表于 2013-6-28 08:55:13 | 显示全部楼层

RE:PIT +ADC,代码麻烦高手看看问题在哪里,谢谢!!

自己顶一下!!
更正下:
注释掉PIT代码后,ADC代码可以进中断,但是COCO标志一直为零,读不到数据,
哪位高手知道具体原因吗?
回复 支持 反对

使用道具 举报

该用户从未签到

6

主题

24

帖子

0

新手上路

Rank: 1

积分
46
最后登录
1970-1-1
 楼主| 发表于 2013-7-1 18:30:51 | 显示全部楼层

RE:PIT +ADC,代码麻烦高手看看问题在哪里,谢谢!!

问题解决了.新问题是ADC采集的数据不正确.采集端接地之后还有0.5v左右的数值.有人知道原因吗?
回复 支持 反对

使用道具 举报

该用户从未签到

10

主题

459

帖子

0

中级会员

Rank: 3Rank: 3

积分
303
最后登录
2024-10-24
发表于 2013-7-2 09:58:37 | 显示全部楼层

回复:PIT +ADC,代码麻烦高手看看问题在哪里,谢谢!!

不知道是不是AD 校准的的原因。
回复 支持 反对

使用道具 举报

该用户从未签到

6

主题

24

帖子

0

新手上路

Rank: 1

积分
46
最后登录
1970-1-1
 楼主| 发表于 2013-7-3 19:50:20 | 显示全部楼层

RE:PIT +ADC,代码麻烦高手看看问题在哪里,谢谢!!

如楼上所讲,是校准的问题。
校准加入后,问题解决。
新问题是,一旦PIT中断时间过短,例如50K采样率的时候,COCO标志和ADACT标志不正确,明确的说就是ADACT一直处于ADC 转换状态,COCO也因此没有置一。
请问有什么办法可以解决上次ADC转换完成后,下次ADC重新开始一直等待的问题吗?
回复 支持 反对

使用道具 举报

该用户从未签到

6

主题

17

帖子

0

新手上路

Rank: 1

积分
36
最后登录
1970-1-1
发表于 2013-7-9 23:01:28 | 显示全部楼层

RE:PIT +ADC,代码麻烦高手看看问题在哪里,谢谢!!

我的PIT怎么就进不了中断函数呢,感觉和你的也没啥差别
回复 支持 反对

使用道具 举报

该用户从未签到

6

主题

17

帖子

0

新手上路

Rank: 1

积分
36
最后登录
1970-1-1
发表于 2013-7-9 23:01:54 | 显示全部楼层

RE:PIT +ADC,代码麻烦高手看看问题在哪里,谢谢!!

我的PIT怎么就进不了中断函数呢,感觉和你的也没啥差别
回复 支持 反对

使用道具 举报

该用户从未签到

10

主题

459

帖子

0

中级会员

Rank: 3Rank: 3

积分
303
最后登录
2024-10-24
发表于 2013-7-10 10:38:35 | 显示全部楼层

回复:PIT +ADC,代码麻烦高手看看问题在哪里,谢谢!!

回复第 5 楼 于2013-07-03 19:50:20发表:
如楼上所讲,是校准的问题。
校准加入后,问题解决。
新问题是,一旦PIT中断时间过短,例如50K采样率的时候,COCO标志和ADACT标志不正确,明确的说就是ADACT一直处于ADC 转换状态,COCO也因此没有置一。
请问有什么办法可以解决上次ADC转换完成后,下次ADC重新开始一直等待的问题吗?
 
你这里的问题是PIT中断的频率大于AD的转换频率,通常对于十二位的不做硬件平均的AD最短转换时间为1.1-1.3us左右(数据为粗略计算,可以参考RM的ADC转换章节),假设你做20次硬件平均也就26us了,你这里PIT的时间为20us,所以就已经超过了,建议降低硬件平均的个数。
 
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-20 04:34 , Processed in 0.103894 second(s), 28 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表