野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13172|回复: 5

如何定时对ADC进行中断采样

[复制链接]
发表于 2016-9-18 13:05:43 | 显示全部楼层 |阅读模式
最近做一个电压采样的程序,需要对在20ms内对电压采集12次,就是1.667ms定时一次,定时器中断后开启ADC中断,读取一下ADC值,将ADC值存取缓存区。
看了野火的程序,搞不清楚ADC的中断是怎么产生的。好像直接读取。

回复

使用道具 举报

发表于 2016-9-18 13:45:11 | 显示全部楼层
adc可以使用软件触发或定时器触发,例程里没有使用定时器,所以是直接用软件触发的,你配置一下定时器,然后把触发源配置一下就可以了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-18 14:05:48 | 显示全部楼层
void TIM2_Configuration(void)
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        TIM_OCInitTypeDef TIM_OCInitStructure;
        TIM_TimeBaseStructure.TIM_Period=10000;//设置100ms一次TIM2比较的周期
        TIM_TimeBaseStructure.TIM_Prescaler=719;//系统主频72M,这里分频720,相当于100K的定时器2时钟
        TIM_TimeBaseStructure.TIM_ClockDivision=0x0;
        TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
        TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
        TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;//下面详细说明
        TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//TIM_OutputState_Disable;
        TIM_OCInitStructure.TIM_Pulse=5000;
        TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;//如果是PWM1要为Low,PWM2则为High
        TIM_OC2Init(TIM2,&TIM_OCInitStructure);
        TIM_Cmd(TIM2,ENABLE);
        TIM_InternalClockConfig(TIM2);
        TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Enable);
        TIM_UpdateDisableConfig(TIM2,DISABLE);
}

void ADC_Configuration(void)
{
                ADC_InitTypeDef ADC_InitStructure;
                ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;
                ADC_InitStructure.ADC_ScanConvMode=DISABLE;//关闭通道扫描模式
                ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;//注意不要使用持续转换模式,否则只要触发一次,
                //后续的转换就会永不停歇(除非CONT清0),这样第一次以后的ADC,就不是由TIM2_CC2来触发了
                ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_T2_CC2;//配置TIM2_CC2为触发源
                ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;
                ADC_InitStructure.ADC_NbrOfChannel=1;
                ADC_Init(ADC1,&ADC_InitStructure);
                RCC_ADCCLKConfig(RCC_PCLK2_Div6);//配置时钟(12MHz),在RCC里面还应配置APB2=AHB时钟72MHz,
                ADC_RegularChannelConfig(ADC1,ADC_Channel_8,1,ADC_SampleTime_1Cycles5);
                ADC_Cmd(ADC1,ENABLE);ADC_ResetCalibration(ADC1);
                while(ADC_GetResetCalibrationStatus(ADC1));
                ADC_StartCalibration(ADC1);//Start Calibration register
                while(ADC_GetCalibrationStatus(ADC1));//waiting for finishing the calibration
                ADC_ExternalTrigConvCmd(ADC1,ENABLE);
       
//设置外部触发模式使能(这个“外部“其实仅仅是相//对于ADC模块的外部,实际上还是在STM32内部)
}

看到这两个设置,但是ADC值,是怎么读出来的
回复 支持 反对

使用道具 举报

发表于 2016-9-18 16:48:00 | 显示全部楼层
ADC是可以有 事件触发的  看框图就知道了
回复 支持 反对

使用道具 举报

发表于 2016-9-18 17:10:23 | 显示全部楼层
设置成外部触发,用PWM触发就可以了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-19 08:57:05 | 显示全部楼层
tianzhen 发表于 2016-9-18 17:10
设置成外部触发,用PWM触发就可以了

是否例程序可以参考,一直没找到例程
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2025-1-12 21:38 , Processed in 0.037437 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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