打印
[其他ST产品]

大神们,,我要5K的采样率,,请帮我看看

[复制链接]
2918|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
danlei|  楼主 | 2014-8-7 16:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
TI, AD, IO, ST, ADC
*******************************************************************************/
int main(void)
{
       
        RCC_Configuration();
        GPIO_Configuration();
        NVIC_Configuration();
        TIM2_Configuration();
  usart_Configuration();
        ADC_Configuration();
  while(1)
        {
  }
}

//.........................................................................................................
//ÖжÏÖ´Ðк¯Êý
void TIM2_IRQHandler(void)
{
   vu16 capture2 = 0;       
   if(TIM_GetITStatus(TIM2,TIM_IT_CC2) != RESET)
         {
                 TIM_ClearITPendingBit(TIM2,TIM_IT_CC2);
                 GPIO_WriteBit(GPIOE,GPIO_Pin_8,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOE,GPIO_Pin_8)));
                 
                 ADC_SoftwareStartConvCmd(ADC1,ENABLE);
                 do
                         {
                                 id = ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC);
             }while(!id);
             AD_value_float = ADC_GetConversionValue(ADC1);          //·µ»Ø×î½üÒ»´ÎADC³£¹æת»»½á¹û
          AD_value_float = AD_value_float/4096*13200;
          printf("%.2fV\r\n",AD_value_float);               
                 capture2 = TIM_GetCapture2(TIM2);
                 TIM_SetCompare2(TIM2,capture2 + CCR2_Val);
                 
     
   }
}

/*******************************************************************************
* Function Name  : ADC_Configuration
* Description    : Configure the ADC.
* Input          : None
* Output         : None
* Return         : None
* Attention                 : None
*******************************************************************************/
//¶Ë¿ÚÅäÖÃ
void GPIO_Configuration(void)
{  
        GPIO_InitTypeDef GPIO_InitStructure;
/* Configure PE.07 (LED 1), as analog output -------*/       
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOE, &GPIO_InitStructure);  
/* Configure PA.06 (ADC Channel6), PA.07 (ADC Channel7) as analog input -------*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;       
        GPIO_Init(GPIOA, &GPIO_InitStructure);
}


//...................................................................................................
//ʱÖÓÅäÖÃ
void RCC_Configuration(void)
{  

        ErrorStatus HSEStartUpStatus;//½«ÍⲿʱÖÓÉèÖÃΪö¾Ù±äÁ¿
       
        RCC_DeInit();//¸´Î»RCCÍⲿÉ豸¼Ä´æÆ÷µ½Ä¬ÈÏÖµ
        RCC_HSEConfig(RCC_HSE_ON);//´ò¿ªÍⲿ¾§Õñ
       
        HSEStartUpStatus = RCC_WaitForHSEStartUp();//¼ì²âÍⲿ¾§ÕñÊÇ•ñ¾ÍÐ÷
if(HSEStartUpStatus == SUCCESS)//Èô¾ÍÐ÷
        {
          RCC_HSICmd(ENABLE);                                    
    RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);                 
               
    RCC_HCLKConfig(RCC_SYSCLK_Div1);                        
    RCC_PCLK1Config(RCC_HCLK_Div2);/* PCLK1 = HCLK */
                RCC_PCLK2Config(RCC_HCLK_Div1);
                RCC_ADCCLKConfig(RCC_PCLK2_Div8);//ÅäÖÃADCʱÖÓ(72/4)9M
                //ÅäÖÃPLLʱÖÓ                     
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
                RCC_PLLCmd(ENABLE);
                while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)== RESET)//¼ì²âPLLÊÇ•ñ¾ÍÐ÷£¬RESET:¾ÍÐ÷
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//ÅäÖÃÍⲿʱÖÓ×÷ΪϵͳʱÖÓ
                while(RCC_GetSYSCLKSource()!=0x08);//¼ì²âÍⲿʱÖÓÊÇ•ñ×÷ΪPLLµÄÊäÈëʱÖÓ
  }
/*¸ø¸÷Ä£¿é¿ªÆôʱÖÓ*/
                RCC_ADCCLKConfig(RCC_PCLK2_Div8);//(72/8)M
               
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//Æô¶¯DMA1ʱÖÓ
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 , ENABLE);//Æô¶¯ADC1ʱÖÓ   
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //Æô¶¯TIM2ʱÖÓ       
          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE ,ENABLE);
}


//¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£
//ÖжÏÅäÖÃ
void NVIC_Configuration(void)
{  
   NVIC_InitTypeDef NVIC_InitStructure;//³õʼ»¯ÖжϕÖ×麯Êý
#ifdef  VECT_TAB_RAM                                      
   NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else                                                                                                      
   NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   
#endif
   //ʹÄܶ¨Ê±TIM2ÖжϠ                                                        
   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);        //ÅäÖÃÓÅÏȼ¶×é                                                   
   NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;  //ÉèÖÃTIM2ͨµÀÊäÈëÖжÏ
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; /* Configure the NVIC Preemption Priority Bits[ÅäÖÃÓÅÏȼ¶×é] */
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //ÉèÖÃÏìÓ¦ÓÅÏȼ¶
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   /* Enable the TIM2 gloabal Interrupt [ÔÊÐíTIM2È«¾ÖÖжÏ]*/
   NVIC_Init(&NVIC_InitStructure);//³õʼ»¯
}



//...............................................................................................................
//¶¨Ê±Æ÷ÅäÖÃ
void TIM2_Configuration(void)
{
        //³õʼ»¯½á¹¹Ìå
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_OCInitTypeDef  TIM_OCInitStructure;
  TIM_DeInit(TIM2);//TIM2
        TIM_TimeBaseStructure.TIM_Period = 19;
        TIM_TimeBaseStructure.TIM_Prescaler = 719;     
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;     //ʱÖÓ•Ö¸î0
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //ÏòÉϼÆÊý
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
       
  //ÉèÖÃÔ¤•ÖƵֵÇÒÁ¢¼´×°Èë
        TIM_PrescalerConfig(TIM2,719,TIM_PSCReloadMode_Immediate);//µ¥´Î¼ÆÊýʱ¼äT=(7199+1)/72MHZ=100us£¬T=(3599+1)/72MHZ=50us
        //ÉèÖÃOC1ͨµÀ£¬¹¤×÷ģʽΪ¼ÆÊýÆ÷ģʽ£¬
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;      //TIMÊä³ö±È½Ïʱ¼äģʽ
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;    //ʹÄÜÊä³ö±È½Ï״̬
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;       //Êä³ö±È½Ï¼«ÐÔ¸ß
        TIM_OCInitStructure.TIM_Pulse = CCR2_Val;                   
        TIM_OC2Init(TIM2,&TIM_OCInitStructure);         
        /*½ûֹԤװÔؼĴæÆ÷£¬ÊÇÒòΪ¶¨Ê±Æ÷×î´ó¼ÆÊýÖÜÆÚΪ66635£¬½ûÖ¹ÖØ×°ÔØ£¬¾ÍʹµÃ¼ÆÊýÖµÂú²úÉúÒç³öÖжϺó£¬
        ¼ÆÊýÖµ»Ø¹éÖÁÁãÖØÐÂÏòÉϼÆÊ££¬¶ø²»ÊǼÌÐøÉÏÒ»´ÎµÄÖµ¼ÌÐø¼ÆÊý*/
        TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Disable);       
        //ʹÄÜTIM2ÖжÏ
  TIM_ITConfig(TIM2, TIM_IT_CC2, ENABLE); //ʹÄÜTIM2µÄ¸üР 
        //Æô¶¯TIM2¼ÆÊý
  TIM_Cmd(TIM2, ENABLE);                             
  
}



//....................................................................................................
//ADCÅäÖÃ
void ADC_Configuration(void)
{
        ADC_InitTypeDef ADC_InitStructure;
        DMA_InitTypeDef DMA_InitStructure;

  /* DMA channel1 configuration ----------------------------------------------*/
  DMA_DeInit(DMA1_Channel1);
  DMA_InitStructure.DMA_PeripheralBaseAddr = ADC_DR_Address;
  DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  DMA_InitStructure.DMA_BufferSize = 1;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  DMA_Init(DMA1_Channel1, &DMA_InitStructure);
  
  /* Enable DMA1 channel1 */
  DMA_Cmd(DMA1_Channel1, ENABLE);
   
  /* ADC1 configuration ------------------------------------------------------*/
  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None ;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_NbrOfChannel = 1;
  ADC_Init(ADC1, &ADC_InitStructure);

  /* ADC1 regular channel6 configuration */
  ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 1, ADC_SampleTime_55Cycles5);

  /* Enable ADC1 DMA */

  ADC_Cmd(ADC1, ENABLE);
  


  /* Enable ADC1 reset calibaration register */   
  ADC_ResetCalibration(ADC1);
  /* Check the end of ADC1 reset calibration register */
  while(ADC_GetResetCalibrationStatus(ADC1));

  /* Start ADC1 calibaration */
  ADC_StartCalibration(ADC1);
  /* Check the end of ADC1 calibration */
  while(ADC_GetCalibrationStatus(ADC1));
     
  /* Start ADC1 Software Conversion */
  ADC_SoftwareStartConvCmd(ADC1, ENABLE);
       

}
沙发
danlei|  楼主 | 2014-8-7 16:26 | 只看该作者
请帮我一下。。。。我弄了好久了,,,,非常感谢

使用特权

评论回复
板凳
danlei|  楼主 | 2014-8-7 16:31 | 只看该作者
串口函数

void UsartGPIO_Configuration(void)
{
        GPIO_InitTypeDef GPIO_InitStruct;

        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

        GPIO_Init(GPIOA, &GPIO_InitStruct);

        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
       
        GPIO_Init(GPIOA, &GPIO_InitStruct);
}

void usart_Configuration(void)
{
        USART_InitTypeDef USART_InitStruct;
       
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
               
        USART_InitStruct.USART_BaudRate = 115200;
        USART_InitStruct.USART_StopBits = USART_StopBits_1;
        USART_InitStruct.USART_WordLength = USART_WordLength_8b;
        USART_InitStruct.USART_Parity = USART_Parity_No;
        USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        USART_InitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
       
        USART_Init(USART1, &USART_InitStruct);
        USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
        USART_Cmd(USART1, ENABLE);

        UsartGPIO_Configuration();
}

//²»Ê¹ÓðëÖ÷»úģʽ
#if 1 //Èç¹ûûÓÐÕâ¶Î£¬ÔòÐèÒªÔÚtargetÑ¡ÏîÖÐÑ¡ÔñʹÓÃUSE microLIB
#pragma import(__use_no_semihosting)
struct __FILE  
{  
        int handle;  
};  
FILE __stdout;  

_sys_exit(int x)  
{  
        x = x;  
}
#endif

PUTCHAR_PROTOTYPE
{
        /* Place your implementation of fputc here */
        /* e.g. write a character to the USART */

        USART_SendData(USART1,(u8)ch);
        /* FlagStatus Status;
         USART_SendData(USART1,(u32)"AT");
         
        Status = USART_GetFlagStatus(USART1,USART_FLAG_RXNE);
        if(Status == SET){
                   //USART_SendData(USART1,USART_ReceiveData(USART1));
                         USART_SendData(USART1,(u32)"AT+BAUD8");
      }
        */
  
       
        /* Loop until the end of transmission */
        while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);

        return ch;
}

使用特权

评论回复
地板
longmaodo| | 2014-8-7 17:10 | 只看该作者
说说现象  遇到什么问题了呀  就一代码
看起来太麻烦了

使用特权

评论回复
5
longmaodo| | 2014-8-7 17:14 | 只看该作者
你这代码太乱了  你先调一块功能 比如先调试定时器
等定时器调试好了 再单独调试ADC 然后再往一起拼  
还有定时中断中不要做ADC采样  时间太长了

使用特权

评论回复
6
大沙发的| | 2014-8-7 20:07 | 只看该作者
这不叫问问题

使用特权

评论回复
7
mmuuss586| | 2014-8-7 20:16 | 只看该作者
用的STM32?
用定时器触发采样;

使用特权

评论回复
8
Rain_King| | 2014-8-8 08:37 | 只看该作者
先说现象....这个代码,很难有人看...

使用特权

评论回复
9
danlei|  楼主 | 2014-8-8 11:12 | 只看该作者
我要5K的采样率,,,但是我只能得到3K多,,,,,,,用通用定时器设置了200us触发中断

使用特权

评论回复
10
danlei|  楼主 | 2014-8-8 11:13 | 只看该作者
longmaodo 发表于 2014-8-7 17:10
说说现象  遇到什么问题了呀  就一代码
看起来太麻烦了


我要5K的采样率,,,但是我只能得到3K多,,,,,,,用通用定时器设置了200us触发中断

使用特权

评论回复
11
danlei|  楼主 | 2014-8-8 11:17 | 只看该作者
longmaodo 发表于 2014-8-7 17:14
你这代码太乱了  你先调一块功能 比如先调试定时器
等定时器调试好了 再单独调试ADC 然后再往一起拼  
还 ...

我的AD采用的是单次转换,,所以我想在定时中断中再次启动AD装换。。我才学习弄这个,,请多多指教

使用特权

评论回复
12
danlei|  楼主 | 2014-8-8 11:19 | 只看该作者
大沙发的 发表于 2014-8-7 20:07
这不叫问问题

不好意思,,发的时候没有想好,,,以后会改,,,,希望多多指教

使用特权

评论回复
13
danlei|  楼主 | 2014-8-8 11:22 | 只看该作者
mmuuss586 发表于 2014-8-7 20:16
用的STM32?
用定时器触发采样;

是的,,我要得到5K的采样率才行,,但是这个只有3K多。。。。。可以帮助我一下吗?

使用特权

评论回复
14
mmuuss586| | 2014-8-8 12:14 | 只看该作者
danlei 发表于 2014-8-8 11:22
是的,,我要得到5K的采样率才行,,但是这个只有3K多。。。。。可以帮助我一下吗? ...

把系统时钟读出来看看,是不是72M;
写个简单定时器程序,拿示波器看下,定时对不对;

你程序的配置是对的,算出来5K,我怀疑系统时钟不对;

使用特权

评论回复
15
ar_m_cu| | 2014-8-8 12:21 | 只看该作者
你的ADC时钟为 9MHz,采样周期为55.5个时钟周期
你的最高采样速率大约为 132K,完全可以满足你的要求。

你的代码太长太乱,没细看。给你几个建议:
你的ADC使用的是单次单通道转换,就没必要用DMA了;
不要在TIM的中断中处理所有的采样操作,在TIM中断中应该只是出发ADC采样;
使能ADC采样完成中断;减少使用prinf的频率,不用每次转换都发送,积攒多次后发送,printf函数的执行时间不确定且很长;
每200us产生一次中断的TIM用法你有错误,按照你的用法,你产生中断的周期应该是 200us + 中断处理时间 + 中断延迟等,而且你的中断处理时间过长,包括了ADC转换时间 + 数据计算时间 + 不确定多长时间的printf执行时间。

使用特权

评论回复
16
longmaodo| | 2014-8-8 14:16 | 只看该作者

1. 建议你在时钟中断中只计数,转换在main函数中做。
2. 可以找一个管脚  在AD转换前管脚发一个脉冲,在AD转换完成后发一个脉冲
   那示波器看看AD转换用了多长时间
3. 去掉printf函数!这个函数时间真心不短呀。

使用特权

评论回复
17
danlei|  楼主 | 2014-8-8 14:25 | 只看该作者
mmuuss586 发表于 2014-8-8 12:14
把系统时钟读出来看看,是不是72M;
写个简单定时器程序,拿示波器看下,定时对不对;

好的,,谢谢

使用特权

评论回复
18
danlei|  楼主 | 2014-8-8 14:26 | 只看该作者
ar_m_cu 发表于 2014-8-8 12:21
你的ADC时钟为 9MHz,采样周期为55.5个时钟周期
你的最高采样速率大约为 132K,完全可以满足你的要求。

好的,,我再改进一下,,谢谢帮助。

使用特权

评论回复
19
danlei|  楼主 | 2014-8-8 14:27 | 只看该作者
longmaodo 发表于 2014-8-8 14:16
1. 建议你在时钟中断中只计数,转换在main函数中做。
2. 可以找一个管脚  在AD转换前管脚发一个脉冲,在AD ...

谢谢帮助

使用特权

评论回复
20
danlei|  楼主 | 2014-8-8 16:38 | 只看该作者
ar_m_cu 发表于 2014-8-8 12:21
你的ADC时钟为 9MHz,采样周期为55.5个时钟周期
你的最高采样速率大约为 132K,完全可以满足你的要求。

你好!
    如果我要去掉printf函数。。。。。我看来一下是不是可以用const来代替实现。。。。希望给予一点指教。。。。谢谢

使用特权

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

本版积分规则

3

主题

15

帖子

0

粉丝