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

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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版