你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。
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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
微信公众号
手机版
快速回复
返回顶部
返回列表
回复: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控制