OpenEdv-开源电子网

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

STM32 ADC转换(中断方式)---改自战舰板ADC例程.

[复制链接]

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-7-25 11:34:59 | 显示全部楼层 |阅读模式
其实很简单.给需要参考的朋友一点参考吧.

核心代码:
u16 adcval=0;

//ADC中断服务函数
void ADC1_2_IRQHandler(void)
{
adcval=ADC1->DR;
printf("ADC:%d\r\n",adcval);
ADC1->SR&=~(1<<1); //清除中断
}
  
//初始化ADC
//这里我们仅以规则通道为例
//我们默认仅开启通道1   
void  Adc_Init(void)
{    
//先初始化IO口
  RCC->APB2ENR|=1<<2;    //使能PORTA口时钟 
GPIOA->CRL&=0XFFFFFF0F;//PA1 anolog输入
//通道10/11设置  
RCC->APB2ENR|=1<<9;    //ADC1时钟使能  
RCC->APB2RSTR|=1<<9;   //ADC1复位
RCC->APB2RSTR&=~(1<<9);//复位结束    
RCC->CFGR&=~(3<<14);   //分频因子清零
//SYSCLK/DIV2=12M ADC时钟设置为12M,ADC最大时钟不能超过14M!
//否则将导致ADC准确度下降! 
RCC->CFGR|=2<<14;        
ADC1->CR1&=0XF0FFFF;   //工作模式清零
ADC1->CR1|=0<<16;      //独立工作模式  
ADC1->CR1&=~(1<<8);    //非扫描模式  
ADC1->CR1|=1<<5;       //开启转换完成中断 
ADC1->CR2&=~(1<<1);    //单次转换模式
ADC1->CR2&=~(7<<17);   
ADC1->CR2|=7<<17;   //软件控制转换  
ADC1->CR2|=1<<20;      //使用用外部触发(SWSTART)!!! 必须使用一个事件来触发
ADC1->CR2&=~(1<<11);   //右对齐  
ADC1->SQR1&=~(0XF<<20);
ADC1->SQR1|=0<<20;     //1个转换在规则序列中 也就是只转换规则序列1   
//设置通道1的采样时间
ADC1->SMPR2&=~(7<<3);  //通道1采样时间清空  
  ADC1->SMPR2|=7<<3;     //通道1  239.5周期,提高采样时间可以提高精确度  
ADC1->CR2|=1<<0;   //开启AD转换器  
ADC1->CR2|=1<<3;       //使能复位校准  
while(ADC1->CR2&1<<3); //等待校准结束  
    //该位由软件设置并由硬件清除。在校准寄存器被初始化后该位将被清除。  
ADC1->CR2|=1<<2;        //开启AD校准   
while(ADC1->CR2&1<<2);  //等待校准结束
//该位由软件设置以开始校准,并在校准结束时由硬件清除  
MY_NVIC_Init(2,2,ADC1_2_IRQChannel,2);//组2
}  
//获得ADC值
//ch:通道值 0~16
//返回值:转换结果
u16 Get_Adc(u8 ch)   
{
adcval=0XFFFF;
//设置转换序列    
ADC1->SQR3&=0XFFFFFFE0;//规则序列1 通道ch
ADC1->SQR3|=ch;      
ADC1->CR2|=1<<22;       //启动规则转换通道 
while(adcval==0XFFFF); //等待ADC转换完成     
return adcval; //返回adc值
}

实验17 ADC实验(中断方式).rar

132.55 KB, 下载次数: 2930

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2012-12-29
在线时间
28 小时
发表于 2013-8-8 16:20:36 | 显示全部楼层
回复 支持 反对

使用道具 举报

15

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2012-12-29
在线时间
28 小时
发表于 2013-8-8 18:43:07 | 显示全部楼层
原子哥,我用的 是MINISTM32 参照核心程序修改   必须要把中断函数(其他都一样)改成这样才能用???
u16 adcval=0;

//ADC中断服务函数
void ADC_IRQHandler(void)
{
adcval=ADC1->DR;
// printf("ADC:%d\r\n",adcval);
ADC1->SR&=~(1<<1); //清除中断
}

void ADC1_2_IRQHandler(void)这个不行,是不是中断服务函数不对哦
回复 支持 反对

使用道具 举报

4

主题

11

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2013-3-16
在线时间
3 小时
发表于 2013-8-8 19:33:27 | 显示全部楼层
回复【楼主位】正点原子:
---------------------------------
求多路采集程序
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2013-8-8 20:59:17 | 显示全部楼层
回复【3楼】Zigbee2012:
---------------------------------
Mini板和战舰板用的.s文件不一样,ADC中断服务函数名字也有些不一样.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

15

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2012-12-29
在线时间
28 小时
发表于 2013-8-8 22:03:46 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
谢谢,再问个问题哈  我想提高ADC的采样速度  通过LED翻转(LED翻转频率140K)测得ADC 转换加读取频率是280K左右...PDF不是说可以达到1M嘛?(采样周期设置为最大1.5个周期)
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2013-8-9 10:58:53 | 显示全部楼层
回复【6楼】Zigbee2012:
---------------------------------
280K,那就是560K的采样速度了,测试下来.
1Mhz得连续采样,也就是一次完了,立即开启下一次,你试试循环模式吧.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

10

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
145
金钱
145
注册时间
2013-8-17
在线时间
3 小时
发表于 2013-8-24 15:52:26 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
原子大哥,我用ADC中断,然后设置连续转换模式,怎么没反映了?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2013-8-25 23:28:17 | 显示全部楼层
回复【8楼】搁浅:
---------------------------------
不知道,没用过ADC中断。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

10

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
145
金钱
145
注册时间
2013-8-17
在线时间
3 小时
发表于 2013-9-17 15:29:24 | 显示全部楼层
回复【楼主位】正点原子:
---------------------------------
原子大哥,我用你这个代码烧进去怎么会一直进入中断啊,我用一个发光二极管表示,会一直闪烁,是什么情况。
回复 支持 反对

使用道具 举报

10

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
145
金钱
145
注册时间
2013-8-17
在线时间
3 小时
发表于 2013-9-17 16:14:14 | 显示全部楼层
MY_NVIC_Init(2,2,ADC_IRQHandler,2);//组2这个函数ADC1_2_IRQChannel改成ADC_IRQHandler怎么会出错

error:  #167: argument of type "void (*)(void)" is incompatible with parameter of type "u8"
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2013-9-17 16:21:27 | 显示全部楼层
说明一直在采集啊。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

10

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
145
金钱
145
注册时间
2013-8-17
在线时间
3 小时
发表于 2013-9-17 16:35:13 | 显示全部楼层
回复【3楼】Zigbee2012:
---------------------------------
你好,请问你那个Mini板的ADC中断可以正常工作吗,能不能发给我看一下,感激不尽。
回复 支持 反对

使用道具 举报

10

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
145
金钱
145
注册时间
2013-8-17
在线时间
3 小时
发表于 2013-9-21 13:02:22 | 显示全部楼层
回复【12楼】正点原子:
---------------------------------可是我都没有接输入,一上电就一直采集,这样不对把。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2013-9-21 21:17:54 | 显示全部楼层
ADC采集和你接不接输入没关系啊。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

18

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2014-7-17
在线时间
0 小时
发表于 2014-10-23 21:06:49 | 显示全部楼层
回复【12楼】正点原子:
---------------------------------
原子哥,有没有库函数版的 ADC中断方式??
安逸的生活只会毁了你
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2014-10-23 22:56:45 | 显示全部楼层
回复【16楼】伤心地中海:
---------------------------------
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

18

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2014-7-17
在线时间
0 小时
发表于 2014-10-24 10:16:35 | 显示全部楼层
回复【17楼】正点原子:
---------------------------------
原子哥,这是我自己改的程序,  中断方式ADC,中断进不去,你能帮忙看一下这是什么问题吗?
u16 d=0;
void ADC_Configuration(void)
{
 GPIO_InitTypeDef GPIO_InitStructure;
 ADC_InitTypeDef ADC_InitStructure;
 NVIC_InitTypeDef NVIC_InitStructure;

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA , ENABLE);
 RCC_ADCCLKConfig(RCC_PCLK2_Div2);

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
 GPIO_Init(GPIOA , &GPIO_InitStructure);
 

 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
 ADC_InitStructure.ADC_ScanConvMode = DISABLE;
 ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
 ADC_InitStructure.ADC_NbrOfChannel = 1;
 ADC_Init(ADC1, &ADC_InitStructure);
 
ADC_ResetCalibration(ADC1);
 
while(ADC_GetResetCalibrationStatus(ADC1));

ADC_StartCalibration(ADC1);  
 
while(ADC_GetCalibrationStatus(ADC1));  
 
 

 ADC_RegularChannelConfig(ADC1 , ADC_Channel_1 , 1 , ADC_SampleTime_239Cycles5);
 ADC_SoftwareStartConvCmd(ADC1, ENABLE);
 NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQn;
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;    
 NVIC_InitStructure.NVIC_IRQChannelSubPriority =2;
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
 NVIC_Init(&NVIC_InitStructure);  
 ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE); 
 ADC_DMACmd(ADC1,ENABLE);
 ADC_Cmd(ADC1 , ENABLE);
}


u16 Get_Adc(u8 ch)   
{
  
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );        
  
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
 
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));

return d;
}

u16 Get_Adc_Average(u8 ch,u8 times)
{
u32 temp_val=0;
u8 t;
for(t=0;t<times;t++)
{
temp_val+=Get_Adc(ch);
delay_ms(5);
}
return temp_val/times;
}   
void ADC1_2_IRQHandler(void)
{
 if(ADC_GetITStatus(ADC1,ADC_IT_EOC) == RESET)
 {
   d=ADC_GetConversionValue(ADC1);
     LED0=!1;
 LED1=!1;
  ADC_SoftwareStartConvCmd(ADC1,ENABLE);
  ADC_ClearITPendingBit(ADC1,ADC_IT_EOC);
 }
}>
安逸的生活只会毁了你
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2014-10-24 23:11:35 | 显示全部楼层
回复【18楼】伤心地中海:
---------------------------------
不好意思,库函数不怎么用,帮不到你哦
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

18

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2014-7-17
在线时间
0 小时
发表于 2014-10-25 13:29:12 | 显示全部楼层
回复【19楼】正点原子:
---------------------------------
好吧
安逸的生活只会毁了你
回复 支持 反对

使用道具 举报

12

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
184
金钱
184
注册时间
2015-1-5
在线时间
21 小时
发表于 2015-1-15 11:28:39 | 显示全部楼层
回复【8楼】搁浅:
---------------------------------
我也是使用的ADC中断,设置成连续转换模式,只能转换一次,后面就没反应了,你的问题解决了?
回复 支持 反对

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2015-4-18
在线时间
0 小时
发表于 2015-5-3 20:37:46 | 显示全部楼层
回复【6楼】Zigbee2012:
---------------------------------
你好,我也想参考原子哥的核心程序,他提到.s文件和中断函数名称不一样,请问你解决这个问题了么?新手求指教
回复 支持 反对

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2015-4-18
在线时间
0 小时
发表于 2015-5-3 22:25:00 | 显示全部楼层
回复【15楼】正点原子:
---------------------------------
原子哥,我用mini板运行这个程序时,发现进不去中断服务函数,你知道是为什么吗?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2015-5-5 01:03:57 | 显示全部楼层
回复【23楼】scutwqh:
--------------------------------
不对吧,这个我测试过的啊。你的mini什么版本?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2013-7-9
在线时间
22 小时
发表于 2016-1-22 19:08:20 | 显示全部楼层
谢谢,顶
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2015-1-7
在线时间
12 小时
发表于 2016-3-1 17:27:20 | 显示全部楼层
原子哥你好,请问你的程序为什么是在system文件夹里添加stm32f10x_NVIC.H   等文件啊         我不添加这些文件吧ADC中断分组写成MY_NVIC_Init(2,2,ADC1_2_IRQn,2);//   也可以进ADC中断服务函数                                 
回复 支持 反对

使用道具 举报

20

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
407
金钱
407
注册时间
2016-3-27
在线时间
104 小时
发表于 2016-3-27 11:30:44 | 显示全部楼层
原子哥  为什么我的程序会一直进到中断里出不来了?  显示电压为0V  LED灯也不闪烁了
回复 支持 反对

使用道具 举报

20

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
407
金钱
407
注册时间
2016-3-27
在线时间
104 小时
发表于 2016-3-27 11:43:44 | 显示全部楼层
伤心地中海 发表于 2014-10-24 10:16
回复【17楼】正点原子:
---------------------------------
原子哥,这是我自己改的程序,&nbsp;&nbsp;中断 ...

请问你是进不去中断吗 为什么我却一直在中断里 显示电压为0V呢
回复 支持 反对

使用道具 举报

3

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2017-3-17
在线时间
9 小时
发表于 2017-5-2 16:14:12 | 显示全部楼层
原子哥,为什么我这个MY_NVIC_Init老是有错呀,中断函数类型不匹配,我就是照着你这个程序弄得,怎么回事呀求解
截图00.png
截图03.png
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-21 20:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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