打印
[STM8]

stm8s adc1遇到问题

[复制链接]
5233|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huarana|  楼主 | 2015-1-20 16:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
采用stvd +库函数。

void        ADC1_INIT(void)
                                {
                                        ADC1_DeInit();
                                        GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_IN_FL_NO_IT);
                                        ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, ADC1_CHANNEL_4, ADC1_PRESSEL_FCPU_D2, ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL0, DISABLE);
//                                        ADC1_ScanModeCmd(ENABLE);//启用扫描模式
//                                        ADC1_DataBufferCmd(ENABLE);//启用缓存寄存器存储数据
                                        ADC1_ITConfig(ADC1_IT_EOCIE, DISABLE);
                                        ADC1_Cmd(ENABLE);               
                                        ADC1_StartConversion();                                       
                                }
u16                ADC1_GET(void)
                                {
                                        FlagStatus flag_status;        //设定标志位  SET/RESET
                                        u16        ad_value=0;
                                        ADC1_StartConversion();                                       
                                        flag_status = ADC1_GetFlagStatus(ADC1_FLAG_EOC);
//                                        flag_status = ADC1_GetFlagStatus(ADC1_FLAG_AWS4);
                                if (flag_status == SET) // SET or RESET
                                        {
//                                                flag_status=RESET;
//                                                ADC1_ClearFlag(ADC1_FLAG_EOC);
                                                ad_value=ADC1_GetConversionValue();
                                        }
                                        return ad_value;                                       
                                }

一直进不了if,查不到转换完成标志位置位,返回结果一直是00。注释掉判断标致位这段的话,能正常采集。

采用的是库函数2.1版
沙发
mmuuss586| | 2015-1-20 19:23 | 只看该作者
是不是设置的引脚,通道不对;

AD采集后一直无法完成,执行不到IF内部的语句;

使用特权

评论回复
板凳
huarana|  楼主 | 2015-1-21 08:24 | 只看该作者
mmuuss586 发表于 2015-1-20 19:23
是不是设置的引脚,通道不对;

AD采集后一直无法完成,执行不到IF内部的语句; ...

引脚没问题的,我注释掉  if判断的话 ,ad能够正常采集,也能通过串口看到采集值。  

使用特权

评论回复
地板
huarana|  楼主 | 2015-1-21 10:34 | 只看该作者
把程序改成
u16                ADC1_GET(void)
                                {
                                        FlagStatus flag_status;        //设定标志位  SET/RESET
                                        u16        ad_value=0;
                                        ADC1_StartConversion();                                       
                                        do
                                        {
                                        flag_status = ADC1_GetFlagStatus(ADC1_FLAG_EOC);
                                        }
                                        while(!flag_status);
                                        ad_value=ADC1_GetConversionValue();
                                        return ad_value;                                       
                                }
解决了,看来用if不可行啊。  那就是stm8库函数参考有问题

使用特权

评论回复
5
zdaly| | 2015-3-11 09:03 | 只看该作者
现在遇到差不多的问题,正在查找原因。

使用特权

评论回复
6
huarana|  楼主 | 2015-3-13 11:49 | 只看该作者
zdaly 发表于 2015-3-11 09:03
现在遇到差不多的问题,正在查找原因。

解决了没? 啥现象

使用特权

评论回复
7
popeye021| | 2015-3-13 14:49 | 只看该作者
huarana 发表于 2015-1-21 10:34
把程序改成解决了,看来用if不可行啊。  那就是stm8库函数参考有问题

你把while(!flag_status);改为while(flag_status == RESET);试试看正常不

我遇到过读取管脚状态时,用if(GetStatus() == SET)时无法读到管脚为高电平时的状态,改为
if(GetStatus())就可以了。GetStatus()是获取管脚状态的库函数。

使用特权

评论回复
8
sail8498| | 2015-9-14 00:12 | 只看该作者
很奇怪为什么用IF判断,开始转换到转换完成是要时间的,在未转换完成前都得不到你要的值,当然就不会进IF了,只有用DO WHILE 或者 WHILE 才能一直等待直到转换完成啊。

使用特权

评论回复
9
sail8498| | 2015-9-14 00:14 | 只看该作者
huarana 发表于 2015-1-21 10:34
把程序改成解决了,看来用if不可行啊。  那就是stm8库函数参考有问题

与函数库没关系。。。ADC开始转换到转换完成是有个过程的,在未转换完成前就运行到IF的话当然就不会进入IF了。

用DO WHILE有个等待的过程,是等到ADC转换完成才进入的后面,当然能正常了。

使用特权

评论回复
10
冰河w| | 2015-9-14 20:27 | 只看该作者
GetStatus是获取管脚状态的库函数,楼主试试

使用特权

评论回复
11
FireRiver9| | 2015-9-14 20:40 | 只看该作者
ADC开始转换到转换完成是有个过程的,在未转换完成前就运行到IF的话当然就不会进入IF了

感觉很有道理,do...while是不错的选择,如果不用do...while,而是加个延时行吗

使用特权

评论回复
12
qgmfly| | 2015-9-18 16:20 | 只看该作者
huarana 发表于 2015-1-21 10:34
把程序改成解决了,看来用if不可行啊。  那就是stm8库函数参考有问题

你用if的话,那不是还没等待转换结束,程序直接跳过了if,然后再执行了开始一启新的ADC采样。
正确方法就是用while等待查询转换结束标志。

注释掉了if这句,能采集到ADC,那可能是恰好再执行读取ADC结果时,ADC采样结束了而以

使用特权

评论回复
13
qgmfly| | 2015-9-18 16:22 | 只看该作者
FireRiver9 发表于 2015-9-14 20:40
感觉很有道理,do...while是不错的选择,如果不用do...while,而是加个延时行吗 ...

其实加延时也是可以的……只是要延时的合适

使用特权

评论回复
评论
sail8498 2015-9-23 22:38 回复TA
优先级更高的。 
sail8498 2015-9-23 22:38 回复TA
延时不靠普,如果只是作简单的处理还行,如果有优先极理高的中断产生,就很容易超时,所以必需用WHILE一直等。 
14
Thor9| | 2015-9-18 18:49 | 只看该作者
楼主设置个断点看看是哪段程序的问题

使用特权

评论回复
15
wahe2008| | 2016-1-13 17:11 | 只看该作者
ADC1_ITConfig(ADC1_IT_EOC,ENABLE);
搞了一天,终于发现了,
此库函数是错误的库函数,寄存器中断使能位在5位,可此库函数操作的却是最高位,即中断标志位

**啊,看来直接操作寄存器才安全啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

1122

帖子

12

粉丝