你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32 AD采集 如何用TIM3控制

[复制链接]
yinguangwei-173 提问时间:2011-4-8 20:17 /
小弟最近看了STM32 的AD,看到那个外部触发的方式有几种,现在用对定时器控制AD的采集不是很明白,哪位大侠帮指导一下? 就是大概的思路与过程 ,不胜感激

还有就是AD内部结构图中,如图示部分:
TIM1_CC1事件 和TIM3_TRGO事件 分别值什么呢?
AD 外部触发.JPG
收藏 评论8 发布时间:2011-4-8 20:17

举报

8个回答
liwang0806 回答时间:2011-4-13 20:39:37

回复:stm32 AD采集 如何用TIM3控制

/*******************************************************************************
 函数名: SetSampRate
 输  入:freq : 采样频率 单位Hz
 输  出:void
 功  能:设置采样频率
********************************************************************************/
static void SetSampRate(uint32_t freq)
{
 //配置定时器1第3通道CC3作为ADC的转换触发源
 TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
 TIM_OCInitTypeDef  TIM_OCInitStructure;
 uint16_t Period;
 TIM_Cmd(TIM1, DISABLE);
 //g_oscilloscope.SampleRate = freq;//将采样频率保存到全部变量中
 /*
  采样频率计算公式 :
   period = 72000000 / freq ;  
   1200  ==  60KHz 采样频率
 */
 Period = 72000000 / freq;  
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
 TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
 TIM_TimeBaseStructure.TIM_Period = Period;         
 TIM_TimeBaseStructure.TIM_Prescaler = 0;  
 TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;   
 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 
 TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
 //配置TIM1 OC3 为PWM模式
 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;               
 TIM_OCInitStructure.TIM_Pulse = TIM_TimeBaseStructure.TIM_Period / 2;
 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;        
 
 TIM_OC3Init(TIM1, &TIM_OCInitStructure);
 TIM_Cmd(TIM1, ENABLE);//使能TIM1
 TIM_CtrlPWMOutputs(TIM1, ENABLE);//TIM1 main Output Enable
}
static void StartADC(void)//ADC开始采样
{ DMA_DeInit(DMA1_Channel1);//复位DMA1寄存器到缺省状态
 DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;//选择ADC1的数据寄存器作为源
 DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&g_oscilloscope.Ch1Buf;//目标地址 
 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//设置DMA传输方向,外设(ADC)作为源
 DMA_InitStructure.DMA_BufferSize = SAMPLE_COUNT;//设置缓冲区大小
 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址不自增
 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//存储器地址需要自增
 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//选择外设传输单位:16bit
 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//选择内存传输单位:16bit
 DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//无需循环模式
 DMA_InitStructure.DMA_Priority = DMA_Priority_High;//选择DMA优先级
 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//DMA传输类型,不是内存到内存
 DMA_Init(DMA1_Channel1, &DMA_InitStructure);
 DMA_Cmd(DMA1_Channel1, ENABLE);
 DMA_Cmd(DMA2_Channel5, ENABLE);
 TIM_Cmd(TIM1, ENABLE);}
static void StopADC(void)//ADC停止采样
{
TIM_Cmd(TIM1, ENABLE);。。。。。
}
有思路了吗?   
//配置定时器1第3通道CC3作为ADC的转换触发源,转换的数据直接从ADC数据寄存器通过DMA传输到  (uint32_t)&g_oscilloscope.Ch1Buf;//目标地址 !!!

 
yinguangwei-173 回答时间:2011-4-13 23:40:20

感谢 liwang0806

非常感谢,最近因为AD采样的弄得脑袋一团糟糕~~        
原理:根据采样频率设定TIM 的时间,TIM从0开始计数,当计数器的计数值与输出比较寄存器中的值相等时,就输出高脉冲( PWM1 模式中,占空比保持1/2, ),触发AD的转换; 是这样理解吗?
 
还有一个问题:DMA参数中,buffersize的大小设置,是不是需要传输多个个数据,就设置多大啊的buffersize 啊?
如果一直采样的话,这个缓冲区的大小不可能无限大吧? (RAM有限)
 
 
stargww 回答时间:2012-3-27 13:44:40

回复:stm32 AD采集 如何用TIM3控制

 
demlzeng 回答时间:2013-7-18 16:56:39

回复:stm32 AD采集 如何用TIM3控制

楼主现在做好了吗?我也困在这里了。我用定时器,思路是定时时间到后出发中断,AD采样,DMA存储。但是不知道DMA2_IRQHandler,TIM2_IRQHandler怎么写,求指导
taogashi 回答时间:2013-7-19 10:55:10

RE:stm32 AD采集 如何用TIM3控制

哈哈,看官方例程呗,肯定有
王zheng 回答时间:2013-7-23 19:59:56

RE:stm32 AD采集 如何用TIM3控制

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "SysTick\\systick.h"
#include
#include "USART\\usart.h"
/* Private define ------------------------------------------------------------*/
#define ADC1_DR_Address    ((u32)0x4001244C)
#define  N   100               //每通道采100次
#define  M 6               //为2个通道
/* Private function prototypes -----------------------------------------------*/
void USART_Configuration(void);
void ADC_Configuration(void);
void filter(void);
u16 GetVolt(u16 advalue) ;
/* Private variables ---------------------------------------------------------*/
vu16 ADC_ConvertedValue;
vu16  AD_Value[N][M];   //用来存放ADC转换结果,也是DMA的目标地址
vu16  After_filter[M];    //用来存放求平均值之后的结果
int  i;
int main(void)
{
        u16 value[M];
        Delay_Init();
        USART_Configuration();
        ADC_Configuration();
       
  printf("\r\n****************************************************************\r\n");
  /* Infinite loop */
  while (1)
  {
                    
                filter();  
                for(i=0;i
yiminglei 回答时间:2013-9-11 21:04:26

RE:stm32 AD采集 如何用TIM3控制

定时器TIM1 CC1 发生中断,没有问题;ADC1也没有问题,就是让TIM1 触发ADC1就是没反应,真是奇了个怪了。
mmhhkk 回答时间:2013-10-8 14:02:41

回复:stm32 AD采集 如何用TIM3控制

多系楼主分享

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版