OpenEdv-开源电子网

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

ADC实验

[复制链接]

5

主题

35

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
金钱
221
注册时间
2018-7-31
在线时间
34 小时
发表于 2018-9-20 13:38:52 | 显示全部楼层 |阅读模式
5金钱
不知道为什么会卡在while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
没转换完?大佬们给看看吧
ADC.c
[mw_shl_code=c,true]#include "ADC.h"
#include "delay.h"
void ADC1_Init(void)
{       
        GPIO_InitTypeDef GPIO_InitStructure;
        ADC_InitTypeDef ADC_InitStructure;
       
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1,ENABLE);
        RCC_ADCCLKConfig(RCC_PCLK2_Div6);

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
        GPIO_Init(GPIOA,&GPIO_InitStructure);

        ADC_DeInit(ADC1);
        ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
        ADC_InitStructure.ADC_NbrOfChannel = 1;
        ADC_InitStructure.ADC_ScanConvMode = DISABLE;
        ADC_Init(ADC1,&ADC_InitStructure);
       
        ADC_Cmd(ADC1,ENABLE);
       
        ADC_ResetCalibration(ADC1);
        while(ADC_GetResetCalibrationStatus(ADC1));
        ADC_StartCalibration(ADC1);
        while(ADC_GetCalibrationStatus(ADC1));
}
u16 Get_ADC1(u8 times)
{
        float ADC1_temp;u8 i;
        ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_239Cycles5);
        ADC_SoftwareStartConvCmd(ADC1,ENABLE);
        ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
        for(i=times;i>1;i--)
        {
                while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
                ADC1_temp += ADC_GetConversionValue(ADC1);
                delay_ms(5);
                ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
        }
        return (ADC1_temp/times);
}



[/mw_shl_code]
main.c
[mw_shl_code=c,true]#include "stm32f10x.h"
#include "usart.h"
#include "ADC.h"
#include "led.h"
#include "sys.h"
#include "delay.h"

int main(void)
{       
        u16 average_ADC1;
        ADC1_Init();
        Led_Init();
        uart_init(115200);
        delay_init();
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
       
        while(1)
        {
                Led0_Delay(500,500);
                average_ADC1 = Get_ADC1(10);
                delay_ms(10);
                printf("average_ADC1:%d\r\n",average_ADC1);
        }
       
}
//  GPIO_InitTypeDef  GPIO_InitStructure;

[/mw_shl_code]

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

35

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
金钱
221
注册时间
2018-7-31
在线时间
34 小时
 楼主| 发表于 2018-9-20 13:40:08 | 显示全部楼层
初学者,有什么低级错误就让大家见笑了
回复

使用道具 举报

9

主题

796

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2038
金钱
2038
注册时间
2017-8-2
在线时间
522 小时
发表于 2018-9-20 13:45:36 | 显示全部楼层
用原子的开发板配套的程序吗?
猪猪熊呢?
回复

使用道具 举报

7

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
343
金钱
343
注册时间
2017-4-16
在线时间
72 小时
发表于 2018-9-20 13:51:49 | 显示全部楼层
ADC_SoftwareStartConvCmd(ADC1,ENABLE);  
    ADC_ClearFlag(ADC1, ADC_FLAG_EOC);       //转换完成的标志被清除了,下面的循环就等不到标志了
    for(i=times;i>1;i--)
    {
        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
回复

使用道具 举报

5

主题

35

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
金钱
221
注册时间
2018-7-31
在线时间
34 小时
 楼主| 发表于 2018-9-20 13:53:02 | 显示全部楼层
323232 发表于 2018-9-20 13:45
用原子的开发板配套的程序吗?

是的,战舰
回复

使用道具 举报

5

主题

35

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
金钱
221
注册时间
2018-7-31
在线时间
34 小时
 楼主| 发表于 2018-9-20 13:56:05 | 显示全部楼层
zd845101500 发表于 2018-9-20 13:51
ADC_SoftwareStartConvCmd(ADC1,ENABLE);  
    ADC_ClearFlag(ADC1, ADC_FLAG_EOC);       //转换完成的 ...

我的想法是刷新标志位,这样下次累加的是又一次转换得到的值
回复

使用道具 举报

7

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
343
金钱
343
注册时间
2017-4-16
在线时间
72 小时
发表于 2018-9-20 13:57:51 | 显示全部楼层
ADC_GetConversionValue(ADC1);
这个函数是怎么写的
回复

使用道具 举报

7

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
343
金钱
343
注册时间
2017-4-16
在线时间
72 小时
发表于 2018-9-20 13:59:33 | 显示全部楼层
肯定是标志在这句之前被清除了
回复

使用道具 举报

5

主题

35

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
金钱
221
注册时间
2018-7-31
在线时间
34 小时
 楼主| 发表于 2018-9-20 14:02:44 | 显示全部楼层
zd845101500 发表于 2018-9-20 13:57
ADC_GetConversionValue(ADC1);
这个函数是怎么写的

库函数自带的
回复

使用道具 举报

9

主题

796

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2038
金钱
2038
注册时间
2017-8-2
在线时间
522 小时
发表于 2018-9-20 14:05:05 | 显示全部楼层
也许是某些操作上有问题,硬件一般不会出问题的,软件测试过可以的更不会...除非你用的不配套的。

战舰的AD应该是内部的AD,你看一下STMF103ZET6芯片手册,看一下ADC怎么配置,对比一下
猪猪熊呢?
回复

使用道具 举报

7

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
343
金钱
343
注册时间
2017-4-16
在线时间
72 小时
发表于 2018-9-20 14:05:28 | 显示全部楼层
ADC1_temp += ADC_GetConversionValue(ADC1);
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
for循环里的顺序改成这样
回复

使用道具 举报

9

主题

796

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2038
金钱
2038
注册时间
2017-8-2
在线时间
522 小时
发表于 2018-9-20 14:06:04 | 显示全部楼层
你拿ADC测的什么东西?
猪猪熊呢?
回复

使用道具 举报

7

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
343
金钱
343
注册时间
2017-4-16
在线时间
72 小时
发表于 2018-9-20 14:07:02 | 显示全部楼层
意思就是:   
转换完成会产生标志->检查标志->清除标志->转换完成会产生标志->....
回复

使用道具 举报

5

主题

35

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
金钱
221
注册时间
2018-7-31
在线时间
34 小时
 楼主| 发表于 2018-9-20 14:16:49 | 显示全部楼层
323232 发表于 2018-9-20 14:06
你拿ADC测的什么东西?

就是教程里的第二十二章实验,TPAD的电压
回复

使用道具 举报

5

主题

35

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
金钱
221
注册时间
2018-7-31
在线时间
34 小时
 楼主| 发表于 2018-9-20 14:45:20 | 显示全部楼层
调试模式,每次循环while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));时,SR寄存器的值都是0,0x00000000,STRT位也是0,转换就根本没开始吧,配置的应该没问题啊。
回复

使用道具 举报

9

主题

796

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2038
金钱
2038
注册时间
2017-8-2
在线时间
522 小时
发表于 2018-9-20 14:49:01 | 显示全部楼层
咸鱼打架 发表于 2018-9-20 14:45
调试模式,每次循环while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));时,SR寄存器的值都是0,0x00000000,S ...

是的,一般来说转换完了,这个标志位就会置1,然而没有。


猪猪熊呢?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 01:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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