打印

测一路时 正确测量 多路的时候 确全是0

[复制链接]
3141|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
171795276|  楼主 | 2009-7-30 10:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
AD, ADC, dc, TI, ADC1
是不因为 我计算的时候时间安排得不对,部分程序:

AD初使化:
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//ADC1和ADC3工作在独立模式
ADC_InitStructure.ADC_ScanConvMode = ENABLE;    //模数转换工作在扫描模式(多通道)
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//模数转换工作在单次模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;    //转换由软件而不是外部触发启动
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;    //ADC数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 11;                //顺序进行规则转换的ADC通道的数目
ADC_Init(ADC1, &ADC_InitStructure);    //根据ADC_InitStructure中指定的参数初始化外设ADC1的寄存器
    
//设置指定ADC的规则组通道,设置它们的转化顺序(与原理图上的AI序号一致)和采样时间(取最大值)
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_41Cycles5);//AI10,PA1,Pin35    
ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 2, ADC_SampleTime_41Cycles5);//AI11,PA2,Pin36
ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 3, ADC_SampleTime_41Cycles5);//AI12,PA3,Pin37
ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 4, ADC_SampleTime_41Cycles5);//AI13,PA4,Pin40
ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 5, ADC_SampleTime_41Cycles5);//AI14,PA5,Pin41
ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 6, ADC_SampleTime_41Cycles5);//AI15,PA6,Pin42
ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 7, ADC_SampleTime_41Cycles5);//AI16,PA7,Pin43
ADC_RegularChannelConfig(ADC1, ADC_Channel_14,8, ADC_SampleTime_41Cycles5);//AI17,PC4,Pin44
ADC_RegularChannelConfig(ADC1, ADC_Channel_15,9, ADC_SampleTime_41Cycles5);//AI18,PC5,Pin45
ADC_RegularChannelConfig(ADC1, ADC_Channel_8,10, ADC_SampleTime_41Cycles5);//AI19,PB0,Pin46
ADC_RegularChannelConfig(ADC1, ADC_Channel_9,11, ADC_SampleTime_41Cycles5);//AI20,PB1,Pin47
    
ADC_DMACmd(ADC1, ENABLE);                //使能ADC1的DMA请求    

ADC_Cmd(ADC1, ENABLE);            
ADC_ResetCalibration(ADC1);                    
while(ADC_GetResetCalibrationStatus(ADC1));    //获取ADC重置校准寄存器的状态并等待其值变为0(校准寄存器已初始化)

ADC_StartCalibration(ADC1);    //开始ADC1的校准状态
while(ADC_GetCalibrationStatus(ADC1));//获取ADC校准寄存器的状态并等待其值变为0(已完成校准)


DMA:
DMA_DeInit(DMA1_Channel1);                    
DMA_InitStructure.DMA_PeripheralBaseAddr =ADC1_DR_Address;
DMA_InitStructure.DMA_MemoryBaseAddr =(u32)&iADC1_ConvertedValueTab;

TIM1,定时156.25us:

if(TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)//如果发生TIM2捕获比较中断
      {
     TIM_ClearITPendingBit(TIM1, TIM_IT_Update);//清除TIM2捕获比较中断待处理位
     iADTimesCnt++;
     iADStep++;
    iFlashPeriod=100;
    if(++iFlashCnt>=iFlashPeriod) iFlashCnt=0;
    if(iFlashCnt<50) VOL_LOW;                
    if(iFlashCnt>49) VOL_HIG        
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能ADC1的软件转换启动功能
     }

ADC处理:
if(iADTimesCnt>=128);
{
    iADTimesCnt=0;
    for(c=0;c<11;c++)
    {                        
for(n=0;n<128;n++)iADC1_SquareValue[n][c]=pow(iADC1_ConvertedValueTab[n][c],2); //保存每通道电压的平方值
iADC1_SumSquareValue[c]=0;
for(n=0;n<128;n++)iADC1_SumSquareValue[c]+=iADC1_SquareValue[n][c];//保存每通道平方和
iADC1_SumSquareValue[c]=(iADC1_SumSquareValue[c]>>7);//保存每通道平方和的平均值
iADC1_ValueResult[c]=sqrt(iADC1_SumSquareValue[c]);//保存每通道的有效值
iADC1_ValueResult[c]=((iADC1_ValueResult[c]*3300)>>12);//单位为mV,保存实际电压值
Volt1[c]=(u16)iADC1_ValueResult[c];            
    }


main:

int main(void)
{
    u8 c;
    IWDG_Configuration();
    RCC_Configuration();    //配置各系统时钟
    GPIO_Configuration();    //配置各GPIO接口
    NVIC_Configuration();    //配置嵌套中断向量列表控制器以及中断向量表基地址
    USART1_Configuration();
    TIM2_Configuration();    //定时器TIM2初始化为定时模式
    TIM1_Configuration();   //定时器TIM1初始化为定时模式

    
    data_init();            //数据初始化
    dalay();                //开机延时

    DMA2_Configuration();    //DMA2初使化
    DMA1_Configuration();    //DMA1初使化
    ADC_Configuration();    //ADC初使化
    EXTI_Configuration();    //配置外部中断/事件控制器
//    ADC_DataHandle();

    while(1)
    {
      dalay();            
      ADC_DataHandle();
      for(c=0;c<11;c++)
      {
USART_SendData(USART1,Volt1[c]/1000);       //发电压高位
      //注意,USART_SendData函数不检查是否发送完成
      //等待发送完成
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);

USART_SendData(USART1,Volt1[c]%1000);       //    发电压低位
      //注意,USART_SendData函数不检查是否发送完成
      //等待发送完成
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
       }
    }


}
沙发
171795276|  楼主 | 2009-7-30 10:28 | 只看该作者

时钟

ADC时钟频率 9M
系统时钟频率 72M

使用特权

评论回复
板凳
香水城| | 2009-7-30 10:41 | 只看该作者

请描述一下你的思路,操作步骤

使用特权

评论回复
地板
171795276|  楼主 | 2009-7-30 10:55 | 只看该作者

思路

1、初使化完成后,TIM1计时,在定时器里每156.25us启动一次ADC转换;
2、同时每进一次TIM1中断时,iADTimeCnt自增一次用来计AD转换的次数,计 
   到128次时,ADC_DataHandle()满足处理数据的条件if(iADTimesCnt>=128)
   开始处理数据;
3、在主函数里一直循环执行ADC_DataHandle()与串口发送函数。串口发送11通
   道每一通道测得的数据。
  

使用特权

评论回复
5
171795276|  楼主 | 2009-7-31 09:30 | 只看该作者

DMA配置的传输大小

DMA_InitStructure.DMA_MemoryBaseAddr =(u32)&iADC1_ConvertedValueTab;
由这个数组定的这个数组定义:u16 iADC!_ConvertedValueTab[128][11]

问题是我一共得采20路信号,,,晕哦

使用特权

评论回复
6
171795276|  楼主 | 2009-7-31 09:36 | 只看该作者

谢谢

如此,用常规通道,得每一通道转换一次后就停然后传数据喽。

使用特权

评论回复
7
171795276|  楼主 | 2009-7-31 10:17 | 只看该作者

用注入通道

先搞明白一下,采用单次、连继模式采样多个通道时,是每一通道转换完后数据就传到数据寄存器里,这时DMA就会把数据传到定义的数组里,还是这一组都转完后DMA开始传数据呢。

如里是第二种情况,用注入通道有四个数据寄存器,中断一次也存不了11路的。

嗯,我一共得用到20通道的,ADC1是11通道,ADC3 9个。

使用特权

评论回复
8
171795276|  楼主 | 2009-8-3 09:58 | 只看该作者
没人来喽,怎么。

使用特权

评论回复
9
香水城| | 2009-8-3 12:24 | 只看该作者
看了半天也没有搞明白楼主要做什么,你最好先说说你的目的是什么,要实现什么功能,然后再说你要怎么做,最后再说做了什么。

使用特权

评论回复
10
auzxj| | 2009-8-3 12:40 | 只看该作者
拉回小学重读一年级语文:lol

使用特权

评论回复
11
171795276|  楼主 | 2009-8-4 09:39 | 只看该作者
本帖最后由 171795276 于 2009-8-4 09:40 编辑

谢谢,
我写得不清楚么?
按照以前香主的指导,定下来ADC1 ADC2完成采20路的信号,
后来出来问题,当先只采一路的时候得到的结果是正确的,而采多路时得到的结果全是0.
如何设置的参数,以及最主要的程序还有想让它如何工作的思路都写得很清楚了啊!

使用特权

评论回复
12
香水城| | 2009-8-4 12:15 | 只看该作者

描述的是否清楚,不是你说清楚就清楚,要别人看得懂才行

这是你给的思路,我的问题在每条下面:

1、初使化完成后,TIM1计时,在定时器里每156.25us启动一次ADC转换;
启动一次后要转换几路?这几路的关系是什么?使用什么模式?

2、同时每进一次TIM1中断时,iADTimeCnt自增一次用来计AD转换的次数,计
   到128次时,ADC_DataHandle()满足处理数据的条件if(iADTimesCnt>=128)
   开始处理数据;

TIM1中断是怎么回事?什么中断?TIM1如何设置的?

3、在主函数里一直循环执行ADC_DataHandle()与串口发送函数。串口发送11通
   道每一通道测得的数据。

这个问题与测不准有什么关系?

还有,14楼说的什么9通道、11通道、20通道的设置和关系,在你介绍的思路里,什么地方体现了?

使用特权

评论回复
13
dfsa| | 2009-8-23 20:09 | 只看该作者
既然你测一路是对的,那问题的关键是你的几路A/D是怎么切换的,是不是在每次处理完再切换,会不会处理时间太短,如果是那样,可以考虑加个延时进去

使用特权

评论回复
14
sinadz| | 2009-8-24 15:49 | 只看该作者
程序看的不是很懂,测一路是对的,多路又不对,应该是在多路转换的过程中出问题了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

79

帖子

0

粉丝