OpenEdv-开源电子网

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

STM32F107VCTadc采样周期与定时器中断周期关系

[复制链接]

1

主题

7

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2018-1-30
在线时间
1 小时
发表于 2018-1-30 20:56:27 | 显示全部楼层 |阅读模式
10金钱
   实验:利用STM32F107VCT芯片进行三相电压ADC采样,其中使用ADC_Channel_10,ADC_Channel_11,ADC_Channel_12三路ADC通道.主程序如图1所示,ADC初始化以及配置程序如图2所示。问题是加入ADC采样程序后,定时器的中断周期就不是按照我设定的0.5ms进行采样;注释之后,定时器中断就正常好使了,以上可以通过PA3的高低电平进行观察。
微信图片_20180130205801.png

最佳答案

查看完整内容[请看2#楼]

因为ADC采集需要时间啊!!很正常的
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2018-1-30
在线时间
1 小时
 楼主| 发表于 2018-1-31 10:09:05 | 显示全部楼层
这是主程序运行之后的,PA3高低电平的输出情况
微信图片_20180131101009.jpg
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-1-30 20:56:28 | 显示全部楼层
SALMON 发表于 2018-1-30 21:14
问题是只保留PA3高低电平代码以及TIM3定时器中断代码的话,PA3的高低电平能正常输出,每隔0.5ms进行高低电 ...

因为ADC采集需要时间啊!!很正常的
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2018-1-30
在线时间
1 小时
 楼主| 发表于 2018-1-30 21:05:58 | 显示全部楼层
[mw_shl_code=c,true]void  Adc_Init(void)
{        
        ADC_InitTypeDef ADC_InitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_ADC1        , ENABLE );          //使能ADC1通道时钟


        RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M

        //PA1 作为模拟通道输入引脚                        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                //模拟输入引脚
        GPIO_Init(GPIOC, &GPIO_InitStructure);       

        ADC_DeInit(ADC1);  //复位ADC1

        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;        //ADC工作模式:ADC1和ADC2工作在独立模式
        ADC_InitStructure.ADC_ScanConvMode = ENABLE;       
        ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;       
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;        //转换由软件而不是外部触发启动
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;        //ADC数据右对齐
        ADC_InitStructure.ADC_NbrOfChannel =3;        //顺序进行规则转换的ADC通道的数目
        ADC_Init(ADC1, &ADC_InitStructure);        //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器   

  
        ADC_Cmd(ADC1, ENABLE);        //使能指定的ADC1
       
        ADC_ResetCalibration(ADC1);        //使能复位校准  
         
        while(ADC_GetResetCalibrationStatus(ADC1));        //等待复位校准结束
       
        ADC_StartCalibration(ADC1);         //开启AD校准

        while(ADC_GetCalibrationStatus(ADC1));         //等待校准结束

        ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //使能指定的ADC1的软件转换启动功能

}                                  
//获得ADC值
//ch:通道值 0~3
u16 Get_Adc(u8 ch)   
{
          //设置指定ADC的规则组通道,一个序列,采样时间
        ADC_RegularChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_28Cycles5);
//        ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_28Cycles5 );        //ADC1,ADC通道,采样时间为239.5周期                                      
  ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2, ADC_SampleTime_28Cycles5);
        ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 3, ADC_SampleTime_28Cycles5);
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //使能指定的ADC1的软件转换启动功能       
         
        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束

        return ADC_GetConversionValue(ADC1);        //返回最近一次ADC1规则组的转换结果
}[/mw_shl_code]
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2018-1-30
在线时间
1 小时
 楼主| 发表于 2018-1-30 21:06:38 | 显示全部楼层
上面是ADC初始化代码
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2018-1-30
在线时间
1 小时
 楼主| 发表于 2018-1-30 21:14:11 | 显示全部楼层
问题是只保留PA3高低电平代码以及TIM3定时器中断代码的话,PA3的高低电平能正常输出,每隔0.5ms进行高低电平转换。但是加上ADC采样代码以及计算函数的代码后,PA3的高低电平输出就不是按0.5ms进行高低电平转换啦。是高电平0.6ms,低电平0.5ms,高电平0.3ms进行周期转换。由此,我感觉是不是ADC采样周期与主函数所设置的定时器中断周期相互影响了呢,望各位大佬告知,十分感谢!!!
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2018-1-30
在线时间
1 小时
 楼主| 发表于 2018-1-31 10:06:48 | 显示全部楼层
正点原子 发表于 2018-1-30 20:56
因为ADC采集需要时间啊!!很正常的

原子哥,你好。我的疑问是ADC的采样时间不是也包括在中断时间里面了吗?我设置的中断时间为0.5ms。意思是ADC采样时间肯定小于0.5ms,所以没达到中断时间的话,PA3是一直高电平的,所以PA3的高低电平还应该是每隔0.5ms转换一次吗??
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2018-1-30
在线时间
1 小时
 楼主| 发表于 2018-1-31 10:10:23 | 显示全部楼层
正点原子 发表于 2018-1-30 20:56
因为ADC采集需要时间啊!!很正常的

原子哥,请你结合我刚才发的PA3的高低电平的输出情况,帮忙给分析一下
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 14:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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