OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2943|回复: 4

关于定时器触发ADC采样加入DMA无法设置采样率的问题

[复制链接]

15

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2023-5-13
在线时间
28 小时
发表于 2023-5-24 15:12:14 | 显示全部楼层 |阅读模式
10金钱
//DMA配置
void DMA_Configuration()
{
  DMA_InitTypeDef DMA_InitStructure;
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);

  DMA_DeInit(DMA1_Channel1);
  DMA_InitStructure.DMA_BufferSize = 1;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Disable;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&ADC1->DR);
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_Priority=DMA_Priority_High;
  DMA_Init(DMA1_Channel1,&DMA_InitStructure);
        
  ADC_DMACmd(ADC1,ENABLE);
  DMA_Cmd(DMA1_Channel1, ENABLE);
}
//ADC配置 定时器触发void  ADC_Configuration(void)
{
        ADC_InitTypeDef ADC_InitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE);       
        RCC_ADCCLKConfig(RCC_PCLK2_Div6);
       
          
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;               
        GPIO_Init(GPIOA, &GPIO_InitStructure);       
       
        ADC_DeInit(ADC1);
       
        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;       
        ADC_InitStructure.ADC_ScanConvMode = DISABLE;       
        ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;       
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_CC2;         
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;       
        ADC_InitStructure.ADC_NbrOfChannel = 1;       
        ADC_Init(ADC1, &ADC_InitStructure);       
       
       
        ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1, ADC_SampleTime_239Cycles5 );            
        ADC_ExternalTrigConvCmd(ADC1,ENABLE);
        ADC_Cmd(ADC1, ENABLE);       
        ADC_DMACmd(ADC1,ENABLE);
         
       
        ADC_ResetCalibration(ADC1);                      
        while(ADC_GetResetCalibrationStatus(ADC1));       
        ADC_StartCalibration(ADC1);                     
        while(ADC_GetCalibrationStatus(ADC1));       
}
//定时器配置
void TIM2_Int_Init(u16 arr,u16 psc)
{
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef TIM_OCInitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;       
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);                
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
       

        TIM_TimeBaseStructure.TIM_Period = arr-1;   
        TIM_TimeBaseStructure.TIM_Prescaler =psc-1;
        TIM_TimeBaseStructure.TIM_ClockDivision = 0;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
       
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
        TIM_OCInitStructure.TIM_Pulse=arr/2;
        TIM_OC2Init(TIM2,&TIM_OCInitStructure);  
       
       
        TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Enable);
        TIM_CtrlPWMOutputs(TIM2, ENABLE);
        TIM_Cmd(TIM2, ENABLE);                        
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
133
金钱
133
注册时间
2021-11-28
在线时间
26 小时
发表于 2023-7-24 10:18:52 | 显示全部楼层
你好,我也遇到这个问题,你解决了吗?
回复

使用道具 举报

31

主题

1951

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4418
金钱
4418
注册时间
2018-5-11
在线时间
923 小时
发表于 2023-7-24 15:17:08 | 显示全部楼层
楼上代码中,ADC由T2_CC2触发,
触发间隔也就是ADC的采样率由T2决定,
通过选定T2的PSR及ARR得到需要的采样率。
另外,还要注意的是,
ADC相应的采样时间及转换时间应小于上述触发间隔,
保证ADC有充裕的采样及转换时间。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

15

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2023-5-13
在线时间
28 小时
 楼主| 发表于 2023-7-24 16:12:04 | 显示全部楼层
qweewqqwe 发表于 2023-7-24 10:18
你好,我也遇到这个问题,你解决了吗?

我解决了 用DMA中断配合外部定时器的更新事件
回复

使用道具 举报

5

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
133
金钱
133
注册时间
2021-11-28
在线时间
26 小时
发表于 2023-7-26 10:40:45 | 显示全部楼层
启林 发表于 2023-7-24 16:12
我解决了 用DMA中断配合外部定时器的更新事件

我在使用定时器触发ADC采样,但是定时器设置频率只能定时几十k,高点就采样出来的AD值是0,是设置的采样频率太高了吗?32应该可以以100k的频率采样的呀
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 05:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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