OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 18381|回复: 20

求助:外部触发ADC转换的问题

[复制链接]

52

主题

214

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2012-4-26
在线时间
17 小时
发表于 2012-5-29 15:19:50 | 显示全部楼层 |阅读模式
使用TIM1的通道2触发转换ADC规则通道3,对应的管脚为PB14   和  PA3 , 请问硬件上这两个管脚怎么接啊
努力?奋斗
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-5-29 22:29:00 | 显示全部楼层
TIM1怎么触发?PWM?定时中断?还是什么方式?
如果是定时触发,就不用连接硬件了,软件处理就够了.(当然ADC口还是要连接的.)
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

52

主题

214

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2012-4-26
在线时间
17 小时
 楼主| 发表于 2012-5-30 16:01:02 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
STM32参考手册上,adc用于规则通道的外部触发中,TIM1的CC2输出作为触发源。是使用PWM输出。
努力?奋斗
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-5-30 16:36:28 | 显示全部楼层
回复【3楼】原味_郭:
---------------------------------
这个触发,在内部设置就可以了.不需要PWM输出.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

52

主题

214

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2012-4-26
在线时间
17 小时
 楼主| 发表于 2012-5-30 17:10:55 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
可是STM32自带的例子中,在配置TIM时有下面这句话
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
还有
TIM_CtrlPWMOutputs(TIM1, ENABLE);
努力?奋斗
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-5-30 18:08:35 | 显示全部楼层
这个你要看例子说明,上面应该有说的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

52

主题

214

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2012-4-26
在线时间
17 小时
 楼主| 发表于 2012-5-30 21:32:26 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
上面的说明是  在定时器每次捕获比较事件触发AD转换,但是不明白为什么输出模式配置为TIM_OCMode_PWM1
努力?奋斗
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-5-30 23:25:35 | 显示全部楼层
要产生PWM,就需要设置一个模式.要嘛模式1,要嘛模式2.
产生PWM但是不一定用输出.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

52

主题

214

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2012-4-26
在线时间
17 小时
 楼主| 发表于 2012-5-31 17:17:23 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
谢谢,现在清楚多了,程序也可以正常运行了。
努力?奋斗
回复 支持 反对

使用道具 举报

52

主题

214

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2012-4-26
在线时间
17 小时
 楼主| 发表于 2012-6-1 11:05:46 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
我想用占空比为40%,但是是低电平时ADC开始转换,
可是我看手册上说只有上升沿才能触发转换
该怎么做才能实现低电平时ADC转换,高电平时ADC禁止呢?
努力?奋斗
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-6-1 11:30:46 | 显示全部楼层
回复【10楼】原味_郭:
---------------------------------
STM32的定时器只能捕获边沿.而不是捕获状态.
你可以设置为下降沿开始转换,上升沿停止转换即可.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

52

主题

214

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2012-4-26
在线时间
17 小时
 楼主| 发表于 2012-6-1 13:10:22 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
外部中断可以使用下降沿触发,可是我用的是定时器内部信号触发ADC,手册上说只能是上升沿才能触发AD
努力?奋斗
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-6-1 18:10:20 | 显示全部楼层
不可能的,你用外部输入捕获。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

52

主题

214

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2012-4-26
在线时间
17 小时
 楼主| 发表于 2012-6-4 14:44:55 | 显示全部楼层
回复【13楼】正点原子:
---------------------------------
手册上确实有这句话:
note:  When an external trigger is selected for ADC regular or injected conversion ,only the rising adge of the signal can start the conversion.
外部输入捕获能触发ADC转换吗?
努力?奋斗
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-6-4 16:25:49 | 显示全部楼层
回复【14楼】原味_郭:
---------------------------------
有这句话,那就以手册为准,我前面说法有误.不好意思.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

15

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2011-8-13
在线时间
6 小时
发表于 2012-6-7 19:07:03 | 显示全部楼层
我现在也在搞这个用定时器2 cc2事件控制ADC1 4过通道循环扫描。如果不加定时器触发,能收到DMA中断数据。加了定时器就是没有看到数据输出
定时器的设置我是在开发板例程上改的。如下:不知道错在那里了。
void Timerx_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<0;//TIM2EN:定时器2时钟使能 (Timer 2 clock enable)
    
  TIM2->ARR=arr;  //更新事件装入活动的自动重装载   
TIM2->SC=psc;  //TIMx时钟频率除数的预分频值
TIM2->CR1&=~(1<<4);//DIR:方向 (Direction)DIR:方向 (Direction)
//上面是时基配置
TIM2->CCMR1&=~(3<<8);//00:CC2通道被配置为输出;
TIM2->CCMR1|=7<<12;  //CH2 WM2模式
 
TIM2->CCMR1|=1<<11; //CH2预装载使能    

// TIM2->CCER|=1<<4;   //OC2 输出使能    

TIM2->CR1=0x8000;   //ARPE使能 
TIM2->CR1|=0x01;    //使能定时器3
 
// //这两个东东要同时设置才可以使用中断
// TIM2->DIER|=1<<0;   //允许更新中断
// TIM2->DIER|=1<<6;   //允许触发中断    
// TIM2->CR1|=1<<0;    //使能定时器2
//  MY_NVIC_Init(1,3,TIM2_IRQChannel,2);//抢占1,子优先级3,组2  
}
void MYDMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
{
u32 DR_Base;  //做缓冲用,不知道为什么.非要不可
RCC->AHBENR|=1<<0;//开启DMA1时钟
__nop();                    //等待 DMA1 时钟稳定
    __nop();                    //经测试最少 2 个 nop
    __nop();
DR_Base=cpar; //cpar:外设地址
DMA_CHx->CPAR=DR_Base;   //DMA1 外设地址 
DMA_CHx->CMAR=(u32)cmar; //DMA1,存储器地址

DMA1_MEM_LEN=cndtr;      //保存DMA传输数据量
DMA_CHx->CNDTR=cndtr;    //DMA1,传输数据量在每个数据传输后,这个数值递减。

DMA_CHx->CCR=0X00000000;//复位
DMA_CHx->CCR|=1<<1;    //允许传输完中断
DMA_CHx->CCR|=0<<4;    //从外设读取数据
DMA_CHx->CCR|=1<<5;    //循环模式
DMA_CHx->CCR|=0<<6;  //外设地址非增量模式
DMA_CHx->CCR|=1<<7;  //存储器地址增量模式,因为只有为增量,才能够使得每次
DMA_CHx->CCR|=1<<8;  //外设数据宽度为16位
DMA_CHx->CCR|=1<<10; //存储器数据宽度16位
DMA_CHx->CCR|=1<<12; //通道优先级中等优先级
DMA_CHx->CCR|=0<<14; //非存储器到存储器模式
MY_NVIC_Init(1,2,DMA1_Channel1_IRQChannel ,2); 
ADC1->CR2|=1<<8;    //开启ADC DMA转换    ttttttttttttttjjjjjjjjjjjj
    ADC1->CR2|=1<<0;    //开启ADC并启动转换 tttttttttttttjjjjjjjjjjjjjjj    

void  Adc_Init(void)
{    
//先初始化IO口
RCC->APB2ENR|=1<<4;    //使能PORTC口时钟
    GPIOC->CRL&=0XFFFF0000;//PC 0 1 2 3  anolog输入   
GPIOC->CRL|=0X00008888; //PC 0 1 2 3  anolog输入
//通道10/11设置  
RCC->APB2ENR|=1<<9;    //ADC1时钟使能ADC1EN:ADC1接口时钟使能 (ADC 1 interface clock enable)
__nop();
__nop(); 
__nop();
__nop();
__nop();   
RCC->APB2RSTR|=1<<9;   //ADC1RST:ADC1接口复位 (ADC 1 interface reset)
RCC->APB2RSTR&=~(1<<9);//复位结束
    
RCC->CFGR&=~(3<<14);   //分频因子清零
//SYSCLK72MHZ/DIV2=12M ADC时钟设置为12M,ADC最大时钟不能超过14M!
//否则将导致ADC准确度下降! 
RCC->CFGR|=2<<14; // 10:PCLK2 6分频后作为ADC时钟
     

ADC1->CR1&=~(0XF<<16);   //工作模式清零  
ADC1->CR1|=0<<16;      //独立工作模式
ADC1->CR1|=1<<8;        //SCAN:扫描模式 (Scan mode)
ADC1->CR2|=1<<1;        //启用连续转换 CONT:连续转换 (Continuous conversion)
ADC1->CR1|=1<<14;   //wwwwwwww软件通过这些位定义在间断模式下,收到外部触发后转换规则通道的数目
ADC1->CR1|=1<<11; //wwwwwwww规则通道组上使用间断模式用于开启或关闭规则通道组上的间断模式

ADC1->CR2&=~(7<<17); //清零通道组转换的外部事件
ADC1->CR2|=1<<18|1<<17; //的定时器2的CC2事件事件--选择定时器2的捕获比较2作为转换外部触发
// ADC1->CR2|=1<<19|1<<18|1<<17;//选择为软件触发触发启动
ADC1->CR1&=~(1<<10);//关闭自动的注入通道组转换;ttttttjjjjjj

ADC1->CR2&=~(1<<11);   //右对齐ADC数据右对齐

ADC1->SQR1&=~(0XF<<20);
ADC1->SQR1|=3<<20;     //4个转换在规则序列中
ADC1->SQR3 = 0X00000000;
ADC1->SQR3|= 0X0006B16A;//第一次转换10通道,顺次  

//设置通道0~3的采样时间
ADC1->SMPR1&=0XFFFFF000;//通道10 11 12 13 采样时间清空   
ADC1->SMPR1|=7<<0;      //通道10  239.5周期,提高采样时间可以提高精确度
ADC1->SMPR1|=7<<3;      //通道11  239.5周期,提高采样时间可以提高精确度
ADC1->SMPR1|=7<<6;      //通道12  239.5周期,提高采样时间可以提高精确度
ADC1->SMPR1|=7<<9;      //通道13  239.5周期,提高采样时间可以提高精确度

ADC_ExternalTrigConvCmd(ADC1,ENABLE);// ADC1->CR2|=1<<20;//1:使用外部事件启动转换。

ADC_Cmd(ADC1,ENABLE);//ADC1->CR2|=1<<0;    //开启ADC并启动转换 能或者失能指定的ADC
ADC_ResetCalibration(ADC1);//ADC1->CR2|=1<<3;        //使能复位校准
    while(ADC1->CR2&1<<3);  //等待校准结束
ADC_StartCalibration(ADC1);//ADC1->CR2|=1<<2;        //开启AD校准    
while(ADC1->CR2&1<<2);  //等待校准结束
ADC_DMACmd(ADC1, ENABLE);//ADC1->CR2|=1<<8;    //开启ADC DMA转换    ttttttttttttttjjjjjjjjjjjj
  //ADC1->CR2|=0x000E0000; //软件控制转换 由bit21控制   ttttttttttttttjjjjjjjjjjjj
    //ADC1->CR2|=1<<20;      //使用用外部触发(SWSTART)!!! 必须使用一个事件来触发
//ADC1->CR2|=1<<0;     ///开启AD转换器,第一次唤醒AD转换器   
    //该位由软件设置并由硬件清除。在校准寄存器被初始化后该位将被清除
 }
回复 支持 反对

使用道具 举报

10

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
130
金钱
130
注册时间
2012-12-27
在线时间
0 小时
发表于 2013-4-10 15:03:15 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
原子哥,看手册上说定时器触发AD是在捕获比较寄存器发生事件时,一直不太明白,我开始IO口是高电平,用PWM2模式,arr是3,CCR1是1,这样的话,一个PWM2周期内触发1次AD,是在一个低电平之后的上升沿触发AD,我这样理解对吗?
回复 支持 反对

使用道具 举报

8

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2014-6-6
在线时间
3 小时
发表于 2014-6-12 13:56:56 | 显示全部楼层
回复【16楼】SCmianyangZLY:
---------------------------------
TIM2->CR1=0x8000;   //ARPE使能  
应该是TIM2->CR1=0x0080;
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-6-12 23:18:18 | 显示全部楼层
回复【17楼】BULELJ:
---------------------------------
这个看你怎么配置,手册上说是事件,你就要看这个事件,是什么情况产生的了.事件产生的时机是可以设置的.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2016-11-21
在线时间
18 小时
发表于 2017-3-27 14:32:57 | 显示全部楼层
正点原子 发表于 2012-5-29 22:29
TIM1怎么触发?PWM?定时中断?还是什么方式?
如果是定时触发,就不用连接硬件了,软件处理就够了.(当然ADC口还 ...

原子哥,我想请问下:如果我用PWM脉冲去触发AD转换,如何使它在触发后只转换一次?等待下一次上升沿再触发转换一次。。。也就是一个PWM周期只转换一次!我不清楚这个该如何实现,谢谢!
回复 支持 反对

使用道具 举报

7

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2016-7-1
在线时间
11 小时
发表于 2017-5-8 10:22:14 | 显示全部楼层
正点原子 发表于 2012-5-30 16:36
回复【3楼】原味_郭:
---------------------------------
这个触发,在内部设置就可以了.不需要PWM输出.

原子哥,我想将stm32的adc配置为捕获到一个脉冲的上升沿后启动AD转换,但是定时器这边是配置为pwm输出还是输入捕获,这点没搞明白,有没有相关例程,或者可以给我简单讲讲吗
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-8-21 14:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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