找回密码
 注册
关于网站域名变更的通知
查看: 519|回复: 1
打印 上一主题 下一主题

分享一份定时器TIM3触发adc采样的程序

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-12-3 14:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x

* E- q9 K. B; c9 D" X  {  G分享一份定时器TIM3触发adc采样的程序,可以调用来设置采样率。
- E& {! y- a( p, m7 Z! a. @
程序2:

# r6 m( b. k- O) Y# f9 s; A
  • void ADC1_2_Config(u16 SampleFreq,u16 DMA_BufferSizer)
  • {
  • ADC_InitTypeDef ADC_InitStructure;
  • DMA_InitTypeDef DMA_InitStructure;
  • GPIO_InitTypeDef GPIO_InitStructure;
  • TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;
  • NVIC_InitTypeDef NVIC_InitStructure;
  • RCC_ADCCLKConfig(RCC_PCLK2_Div2);
  • RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  • RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC2, ENABLE);
  • RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  • RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
  • GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_4;
  • GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  • GPIO_Init(GPIOA, &GPIO_InitStructure);
  • //定时器3控制采样率
  • TIM_TimeBaseStructure.TIM_Prescaler= 0;
  • TIM_TimeBaseStructure.TIM_CounterMode= TIM_CounterMode_Up;
  • TIM_TimeBaseStructure.TIM_Period= 72000000 / SampleFreq - 1;
  • TIM_TimeBaseStructure.TIM_ClockDivision= 0;
  • TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
  • TIM_TimeBaseInit( TIM3, &TIM_TimeBaseStructure);
  • TIM_SelectOutputTrigger( TIM3, TIM_TRGOSource_Update );
  • TIM_ARRPreloadConfig(TIM3,ENABLE);
  • TIM_Cmd( TIM3, ENABLE );
  • DMA_DeInit(DMA1_Channel1);                                                   //DMA通道1恢复到默认状态
  • DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_Address;        //设置数据来源地址
  • DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_DualConvertedValueTab;  //设置copy目标地址
  • DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                           //设置copy方向
  • DMA_InitStructure.DMA_BufferSize = ADC_BufferLength;                                       //设置数组大小
  • DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;             //数据来源不变
  • DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                      //数据保存的数组地址自增
  • DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;      //DMA操作字长 32位
  • DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;              //DMA操作字长 32位
  • DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;                                //普通的DMA操作模式:当DMA操作转移够 数组大小                                                                                 //所限定的数据总量后,则不再进行DMA操作
  • DMA_InitStructure.DMA_Priority = DMA_Priority_High;                          //DMA优先级
  • DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                                 //关闭mTM
  • DMA_Init(DMA1_Channel1, &DMA_InitStructure);                                 //使能dma
  • /* Enable DMA1 Channel1 */
  • DMA_Cmd(DMA1_Channel1, ENABLE);
  • /* DMA Transfer Complete Interrupt enable */
  • NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;   //通道
  • NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //占先级
  • NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;        //响应级
  • NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;           //启动
  • NVIC_Init(&NVIC_InitStructure);                           //初始化
  • DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE);
  • /* ADC1 configuration ------------------------------------------------------*/
  • ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;                              //ADC1同步规则组模式
  • ADC_InitStructure.ADC_ScanConvMode = ENABLE;                                  //启动扫描
  • ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;                            //连续转换
  • ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T3_TRGO;           //无外部触发
  • ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;                        //结果右对齐
  • ADC_InitStructure.ADC_NbrOfChannel = 1;                                       //转换通道数2
  • ADC_Init(ADC1, &ADC_InitStructure);                                           //配置ADC1
  • /* ADC1 regular channels configuration */
  • ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_28Cycles5); //通道配置
  • /* Enable ADC1 DMA */
  • ADC_DMACmd(ADC1, ENABLE);
  • /* ADC2 configuration ------------------------------------------------------*/
  • ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;                              //ADC2同步规则组模式
  • 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_InitStructure.ADC_NbrOfChannel = 1;                                       //转换通道数
  • ADC_Init(ADC2, &ADC_InitStructure);                                           //配置ADC2
  • /* ADC2 regular channels configuration */
  • ADC_RegularChannelConfig(ADC2, ADC_Channel_4, 1, ADC_SampleTime_28Cycles5); //通道配置
  • /* Enable ADC2 external trigger conversion */
  • ADC_ExternalTrigConvCmd(ADC2, ENABLE);                                        //使能ADC2的外部触发模式
  • /* Enable ADC1 */
  • ADC_Cmd(ADC1, ENABLE);                                                        //使能ADC1
  • /* Enable Vrefint channel17 */
  • // ADC_TempSensorVrefintCmd(ENABLE);                                             // 使能温度传感器内部参考电压通道
  • /* Enable ADC1 reset calibration register */
  • ADC_ResetCalibration(ADC1);                                                   //ADC1的校准
  • /* Check the end of ADC1 reset calibration register */
  • while(ADC_GetResetCalibrationStatus(ADC1));
  • /* Start ADC1 calibration */
  • ADC_StartCalibration(ADC1);
  • /* Check the end of ADC1 calibration */
  • while(ADC_GetCalibrationStatus(ADC1));
  • /* Enable ADC2 */
  • ADC_Cmd(ADC2, ENABLE);                                                      //使能ADC2
  • /* Enable ADC2 reset calibration register */
  • ADC_ResetCalibration(ADC2);                                                 //ADC2的校准
  • /* Check the end of ADC2 reset calibration register */
  • while(ADC_GetResetCalibrationStatus(ADC2));
  • /* Start ADC2 calibration */
  • ADC_StartCalibration(ADC2);
  • /* Check the end of ADC2 calibration */
  • while(ADC_GetCalibrationStatus(ADC2));
  • /* Start ADC1 Software Conversion */                                        //软件启动ADC1,开始转换
  • ADC_SoftwareStartConvCmd(ADC1, ENABLE);
  • // while(!DMA_GetFlagStatus(DMA1_FLAG_TC1));
  • // /* Clear DMA1 channel1 transfer complete flag */
  • // DMA_CleaRFlag(DMA1_FLAG_TC1);
  • // DMA_Done = 1;
  • }
  • void DMA1_Channel1_IRQHandler(void)
  • {
  • if(DMA_GetITStatus(DMA1_IT_TC1) != RESET)
  • {
  • DMA_ClearITPendingBit(DMA1_IT_TC1);
  • DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,DISABLE);
  • ADC_Cmd(ADC1,DISABLE);
  • ADC_Cmd(ADC2,DISABLE);
  • DMA_Done =1;
  • }
  • }
    ; G7 g0 J) q- ?% i: b. c- |
3 u- n* a% t; O) G
2 K) f1 N1 |/ M" }- V" U4 `

/ o3 P" I2 i  A* a! R$ j调用方式:ADC1_2_Config(5120,512);
; ~" f3 \5 A7 S' ?( P0 |* o3 a' w

& m$ H4 W7 ?' g* M4 e0 P可以用作FFT分析前的采样。
' O0 E0 p8 m; r( i( [4 S

; `3 }9 ~3 j- k( S
& v* y' s7 ~7 I3 n
$ i; k3 C1 B8 _% D! d1 h/ E% p1 j; U: U& k+ i* N
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-9 01:35 , Processed in 0.109375 second(s), 24 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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