打印

Grand 在下遇到一个问题!

[复制链接]
1637|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
armhoo|  楼主 | 2009-8-4 16:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
AN, TI, AD, DMA, DM
我现在想用TIME4触发ADC1采样,待间隔的2KHz,但我设好后,觉得采样的间隔好像有出入,问:如何确定我的有样间隔是正确的!下面是Time4和相关代码的设置:
  /* Time base configuration */
  TIM_TimeBaseStructure.TIM_Period        = 1799;
  /* Note: if(TIM_Prescaler == 1) x1 else x2 */
  TIM_TimeBaseStructure.TIM_Prescaler     = 10;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode   = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

  /* PWM1 Mode configuration: Channel4 */
  TIM_OCInitStructure.TIM_OCMode      = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse       = 900;
  TIM_OCInitStructure.TIM_OCPolarity  = TIM_OCPolarity_Low;
  TIM_OC4Init(TIM4, &TIM_OCInitStructure);
  /* TIM4 enable counter */
  TIM_Cmd(TIM4, ENABLE);

/* DMA1 channel1 configuration -----------------------------------------------*/
  DMA_DeInit(DMA1_Channel1);
  DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
  DMA_InitStructure.DMA_MemoryBaseAddr     = (uint32_t)&ADC_RegularConvertedValueTab;
  DMA_InitStructure.DMA_DIR                = DMA_DIR_PeripheralSRC;
  DMA_InitStructure.DMA_BufferSize         = 1024;
  DMA_InitStructure.DMA_PeripheralInc      = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc          = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  DMA_InitStructure.DMA_MemoryDataSize     = DMA_MemoryDataSize_HalfWord;
  DMA_InitStructure.DMA_Mode               = DMA_Mode_Circular;
  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);
  DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,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_T4_CC4;
  ADC_InitStructure.ADC_DataAlign          = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_NbrOfChannel       = 1;
  ADC_Init(ADC1, &ADC_InitStructure);

  /* ADC1 regular channel12 configuration */
  ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_71Cycles5);

  /* Enable ADC1 DMA */
  ADC_DMACmd(ADC1, ENABLE);

  /* Enable ADC1 */
  ADC_Cmd(ADC1, ENABLE);

  /* Enable ADC1 external trigger */
  ADC_ExternalTrigConvCmd(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));

/**
  * @brief  This function handles DMA1_Channel1 exception.
  * @param  None
  * @retval : None
  */
void DMA1_Channel1_IRQHandler(void)
{
  OSIntEnter();
  if(DMA_GetITStatus(DMA1_FLAG_TC1) != RESET)
  {
    /* Clear the DMA1 pending bit */
    DMA_ClearFlag(DMA1_FLAG_TC1);
    /* TIM1 counter enable */
    TIM_Cmd(TIM4, DISABLE);
    /* 定时器会被AD_HandleData()开启 */
  }
  OSSemPost(pSampleSiginalHandle);
  OSIntExit();
}
沙发
vigia| | 2009-8-4 17:27 | 只看该作者
在每次采样的时候toggle一个I/O口,然后用示波器连上看看,就知道在什么时候做采样了。

使用特权

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

本版积分规则

11

主题

61

帖子

0

粉丝