你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。
chrome
firefox
safari
ie8及以上
ST
意法半导体官网
STM32
中文官网
ST
全球论坛
登录/注册
首页
技术问答
话题
资源
创客秀
视频
标签
积分商城
每日签到
stm32 AD采集 如何用TIM3控制
[复制链接]
yinguangwei-173
提问时间:2011-4-8 20:17 /
小弟最近看了STM32 的AD,看到那个外部触发的方式有几种,现在用对定时器控制AD的采集不是很明白,哪位大侠帮指导一下? 就是大概的思路与过程 ,不胜感激
还有就是AD内部结构图中,如图示部分:
TIM1_CC1事件 和TIM3_TRGO事件 分别值什么呢?
赞
0
收藏
0
评论
8
分享
发布时间:2011-4-8 20:17
举报
请先
登录
后回复
8个回答
liwang0806
回答时间:2011-4-13 20:39:37
a0a.1 0b0c
回复: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;//目标地址 !!!
赞
0
评论
回复
支持
反对
yinguangwei-173
回答时间:2011-4-13 23:40:20
a0a.1 0b0c
感谢 liwang0806
非常感谢,最近因为AD采样的弄得脑袋一团糟糕~~
原理:根据采样频率设定TIM 的时间,TIM从0开始计数,当计数器的计数值与输出比较寄存器中的值相等时,就输出高脉冲( PWM1 模式中,占空比保持1/2, ),触发AD的转换; 是这样理解吗?
还有一个问题:DMA参数中,buffersize的大小设置,是不是需要传输多个个数据,就设置多大啊的buffersize 啊?
如果一直采样的话,这个缓冲区的大小不可能无限大吧? (RAM有限)
赞
0
评论
回复
支持
反对
stargww
回答时间:2012-3-27 13:44:40
a0a.1 0b0c
回复:stm32 AD采集 如何用TIM3控制
赞
0
评论
回复
支持
反对
demlzeng
回答时间:2013-7-18 16:56:39
a0a.1 0b0c
回复:stm32 AD采集 如何用TIM3控制
楼主现在做好了吗?我也困在这里了。我用定时器,思路是定时时间到后出发中断,AD采样,DMA存储。但是不知道DMA2_IRQHandler,TIM2_IRQHandler怎么写,求指导
赞
0
评论
回复
支持
反对
taogashi
回答时间:2013-7-19 10:55:10
a0a.1 0b0c
RE:stm32 AD采集 如何用TIM3控制
哈哈,看官方例程呗,肯定有
赞
0
评论
回复
支持
反对
王zheng
回答时间:2013-7-23 19:59:56
a0a.1 0b0c
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
赞
0
评论
回复
支持
反对
yiminglei
回答时间:2013-9-11 21:04:26
a0a.1 0b0c
RE:stm32 AD采集 如何用TIM3控制
定时器TIM1 CC1 发生中断,没有问题;ADC1也没有问题,就是让TIM1 触发ADC1就是没反应,真是奇了个怪了。
赞
0
评论
回复
支持
反对
mmhhkk
回答时间:2013-10-8 14:02:41
a0a.1 0b0c
回复:stm32 AD采集 如何用TIM3控制
多系楼主分享
赞
0
评论
回复
支持
反对
所属标签
相似问题
关于
意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号
手机版
快速回复
返回顶部
返回列表
回复: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;//目标地址 !!!
感谢 liwang0806
原理:根据采样频率设定TIM 的时间,TIM从0开始计数,当计数器的计数值与输出比较寄存器中的值相等时,就输出高脉冲( PWM1 模式中,占空比保持1/2, ),触发AD的转换; 是这样理解吗?
还有一个问题:DMA参数中,buffersize的大小设置,是不是需要传输多个个数据,就设置多大啊的buffersize 啊?
如果一直采样的话,这个缓冲区的大小不可能无限大吧? (RAM有限)
回复:stm32 AD采集 如何用TIM3控制
回复:stm32 AD采集 如何用TIM3控制
RE:stm32 AD采集 如何用TIM3控制
RE:stm32 AD采集 如何用TIM3控制
#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
RE:stm32 AD采集 如何用TIM3控制
回复:stm32 AD采集 如何用TIM3控制