6375|16

87

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

测一路时正确测量多路的时候确全是0 [复制链接]

是不因为 我计算的时候时间安排得不对,部分程序:

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);
       }
    }


}
此帖出自stm32/stm8论坛

最新回复

                                 程序看的不是很懂,测一路是对的,多路又不对,应该是在多路转换的过程中出问题了  详情 回复 发表于 2009-8-24 15:49
点赞 关注
 

回复
举报

62

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

时钟

ADC时钟频率 9M
系统时钟频率 72M
此帖出自stm32/stm8论坛
 
 

回复

77

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

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

                                  
此帖出自stm32/stm8论坛
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

4
 

思路

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

回复

73

帖子

0

TA的资源

一粒金砂(初级)

5
 

Regular时只有一个DATA寄存器啊

你的DMA配置的传输大小是多少啊,
其实你可以考虑用Inject的方式,这样每个ADC就拥有4个JDR寄存器了
用三个ADC和4个JDR只要中断3次就可以采集完11路信号了,可以参考一下ST的例子,呵呵
此帖出自stm32/stm8论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

6
 

DMA配置的传输大小

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

问题是我一共得采20路信号,,,晕哦
此帖出自stm32/stm8论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

7
 

谢谢

如此,用常规通道,得每一通道转换一次后就停然后传数据喽。
此帖出自stm32/stm8论坛
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

8
 

强烈建议你从regular channel该到inject channel

                                 这样只要一个中断就可以把11个channel处理完了
此帖出自stm32/stm8论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

9
 

用注入通道

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

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

嗯,我一共得用到20通道的,ADC1是11通道,ADC3 9个。
此帖出自stm32/stm8论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

10
 
                                 没人来喽,怎么。
此帖出自stm32/stm8论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

11
 
                                 看了半天也没有搞明白楼主要做什么,你最好先说说你的目的是什么,要实现什么功能,然后再说你要怎么做,最后再说做了什么。
此帖出自stm32/stm8论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

12
 
                                 拉回小学重读一年级语文
此帖出自stm32/stm8论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(中级)

13
 


adcInit.ADC_DataAlign          = ADC_DataAlign_Right;
   adcInit.ADC_Mode               = ADC_Mode_Independent;
   adcInit.ADC_ScanConvMode       = ENABLE;
   adcInit.ADC_ContinuousConvMode = DISABLE;
   adcInit.ADC_ExternalTrigConv   = ADC_ExternalTrigConv_None;
   adcInit.ADC_NbrOfChannel       = 0u;
   
   ADC_Init ( ADC1, &adcInit );
   ADC_Init ( ADC2, &adcInit );
   ADC_Init ( ADC3, &adcInit );

   // ADC1 Injected Channel Configuration ---------------------------------------*/
   // sequence length
   ADC_InjectedSequencerLengthConfig ( ADC1, 4u );
   ADC_InjectedSequencerLengthConfig ( ADC2, 4u );
   ADC_InjectedSequencerLengthConfig ( ADC3, 4u );

   //Configuration

   ADC_InjectedChannelConfig ( ADC1, ADC_Channel_3,  1u, ADC_SAMPLE_TIME );
   ADC_InjectedChannelConfig ( ADC1, ADC_Channel_15, 2u, ADC_SAMPLE_TIME );
   ADC_InjectedChannelConfig ( ADC1, ADC_Channel_13, 3u, ADC_SAMPLE_TIME );
    //MON_12V   ADC12_IN9
   ADC_InjectedChannelConfig ( ADC1, ADC_Channel_9,  4u, ADC_SAMPLE_TIME );
  
   // ********** ADC2 *********
   //IB_BUF    ADC123_IN2
   ADC_InjectedChannelConfig ( ADC2, ADC_Channel_2,  1u, ADC_SAMPLE_TIME );
   
   //IB_HG_BUF ADC12_IN14
   ADC_InjectedChannelConfig ( ADC2, ADC_Channel_14, 2u, ADC_SAMPLE_TIME );
  
   //VB_BUF    ADC123_IN12
   ADC_InjectedChannelConfig ( ADC2, ADC_Channel_12, 3u, ADC_SAMPLE_TIME );
   
   //MON_3V3   ADC12_IN8
   ADC_InjectedChannelConfig ( ADC2, ADC_Channel_8,  4u, ADC_SAMPLE_TIME );
   ADC_SetInjectedOffset     ( MET_ADC_33_DATA, 0x0u );
   
   // ********** ADC3 *********
   //ADC123_IN1
   ADC_InjectedChannelConfig ( ADC3, ADC_Channel_1,   1u, ADC_SAMPLE_TIME );
   
   //ADC123_IN0
   ADC_InjectedChannelConfig ( ADC3, ADC_Channel_0,   2u, ADC_SAMPLE_TIME );
   
   //VC_BUF     
   ADC_InjectedChannelConfig ( ADC3, ADC_Channel_11,  3u, ADC_SAMPLE_TIME );
   
   //    ADC123_IN10
   ADC_InjectedChannelConfig ( ADC3, ADC_Channel_10,  4u, ADC_SAMPLE_TIME );
   
   //external trigger configuration
   ADC_ExternalTrigInjectedConvConfig ( ADC1, ADC_ExternalTrigInjecConv_T1_CC4 );
   ADC_ExternalTrigInjectedConvConfig ( ADC2, ADC_ExternalTrigInjecConv_T1_CC4 );
   ADC_ExternalTrigInjectedConvConfig ( ADC3, ADC_ExternalTrigInjecConv_T1_CC4 );

   //external trigger enable
   ADC_ExternalTrigInjectedConvCmd ( ADC1, ENABLE );
   ADC_ExternalTrigInjectedConvCmd ( ADC2, ENABLE );
   ADC_ExternalTrigInjectedConvCmd ( ADC3, ENABLE );

   //Enable ADC1
   ADC_Cmd ( ADC1, ENABLE );
   ADC_Cmd ( ADC2, ENABLE );
   ADC_Cmd ( ADC3, ENABLE );

给你一个例子,这个例子用T1 的CC4 channel 做Trigger 每64us触发3个ADC工作一次,每个ADC用SCAN模式,扫描4个ADC的Inject channel,在ADC扫描完4个通道后出发JEOC中断,这时4个channel的转换数据已经存入JDR1,JDR2,JDR3和JDR4寄存器了,这样用JEOC中断就同时可以取出3*4=12个16为采样数据了,Inject channel最大长度是4!
此帖出自stm32/stm8论坛
 
 
 

回复

97

帖子

0

TA的资源

一粒金砂(初级)

14
 


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

回复

62

帖子

0

TA的资源

一粒金砂(初级)

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通道的设置和关系,在你介绍的思路里,什么地方体现了?
此帖出自stm32/stm8论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

16
 
                                 既然你测一路是对的,那问题的关键是你的几路A/D是怎么切换的,是不是在每次处理完再切换,会不会处理时间太短,如果是那样,可以考虑加个延时进去
此帖出自stm32/stm8论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(中级)

17
 
                                 程序看的不是很懂,测一路是对的,多路又不对,应该是在多路转换的过程中出问题了
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表