OpenEdv-开源电子网

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

STM32F031ADC数据错位,三个通道的值换来换去

[复制链接]

2

主题

6

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2023-3-15
在线时间
8 小时
发表于 2023-4-14 10:20:51 | 显示全部楼层 |阅读模式
1金钱
为什么ADC三个通道的值一直在换来换去啊,代码如下
  • int main()  
  • {  
  •     TIM3_Init(999, 79);  
  •     ADC1_Init();;  
  •   
  • while (1)  
  •     {  
  •         switch (event)  
  •         {  
  •         case 0 :  
  •         {  
  •              ADC_StartOfConversion(ADC1);  
  •             ADC_ChannelConfig(ADC1, ADC_Channel_6, ADC_SampleTime_55_5Cycles);  
  •         }  
  •         break;  
  •         case 1 :  
  •         {  
  •              data1 = ADC_GetConversionValue(ADC1);  
  •         }  
  •         break;  
  •         case 2 :  
  •         {  
  •              ADC_StartOfConversion(ADC1);  
  •             ADC_ChannelConfig(ADC1, ADC_Channel_7, ADC_SampleTime_55_5Cycles);  
  •         }  
  •         break;  
  •         case 3 :  
  •         {  
  •              data2 = ADC_GetConversionValue(ADC1);  
  •         }  
  •         break;  
  •         case 4 :  
  •         {  
  •             ADC_StartOfConversion(ADC1);  
  •             ADC_ChannelConfig(ADC1, ADC_Channel_9, ADC_SampleTime_55_5Cycles);  
  •         }  
  •         break;  
  •         case 5 :  
  •         {  
  •              data3 = ADC_GetConversionValue(ADC1);  
  •         }  
  •         break;  
  •         case 6 :  
  •         {  
  •   
  •         }  
  •         break;  
  •         case 7 :  
  •         {  
  •    
  •           value1 = (float)data1*3.3/1023;  
  •           value2 = (float)data2*3.3/1023;   
  •               value3 = (float)data3*3.3/1023;  
  •                      
  •             event = 0;  
  •         }  
  •         break;  
  •         }  
  •     }  
  • }  
  •   
  • void TIM3_IRQHandler(void)  
  • {  
  •     if (TIM_GetITStatus(TIM3, TIM_IT_Update) == SET)  
  •     {  
  •         TIM_ClearITPendingBit(TIM3, TIM_IT_Update);  
  •         event++;  
  •     }  
  • }
在用STM32F407的时候完全没有问题,一样的代码,一样的功能。

求助,有没有同学能发现问题

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

使用道具 举报

0

主题

113

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2538
金钱
2538
注册时间
2019-10-18
在线时间
403 小时
发表于 2023-4-14 14:33:02 | 显示全部楼层
这程序写的牛比.你原来的407运行正常是为什么?纯bug运行?
u的运行速度是很快的.假若你当时第一次进中断.event=1后呢.然后while中的case1不就要不听的运行不停的读???读个千遍万遍?
第二次进中断后event=2.后.又不停的转换个千遍万遍?
不应该是一次就好的么.居然放whlie循环中
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2023-3-15
在线时间
8 小时
 楼主| 发表于 2023-4-14 15:51:58 | 显示全部楼层
decai 发表于 2023-4-14 14:33
这程序写的牛比.你原来的407运行正常是为什么?纯bug运行?
u的运行速度是很快的.假若你当时第一次进中断.ev ...

没懂,如果不是不停读的话怎么实现监测的功能呢?
我用b站江科大的的例程在F103上做,AD在while里读取:
while (1)
        {
                AD0 = AD_GetValue(ADC_Channel_0);
                AD1 = AD_GetValue(ADC_Channel_1);
                AD2 = AD_GetValue(ADC_Channel_2);
                AD3 = AD_GetValue(ADC_Channel_3);
       
               
                OLED_ShowNum(1, 5, AD0, 4);
                OLED_ShowNum(2, 5, AD1, 4);
                OLED_ShowNum(3, 5, AD2, 4);
                OLED_ShowNum(4, 5, AD3, 4);
       
               
                Delay_ms(100);
        }
就没有问题。
但是搬到F031上就出现了通道数据混乱错位的问题
while (1)
    {
                        data1=Get_ADC1(ADC_Channel_6);
                        data2=Get_ADC1(ADC_Channel_7);
                        data3=Get_ADC1(ADC_Channel_9);
       
                        OLED_ShowNum(1, 10, data1, 4);
                        OLED_ShowNum(2, 10, data2, 4);
                        OLED_ShowNum(3, 10, data3, 4);
                        Delay(20);
    }
}
我看有的人说是AD初始化顺序的问题,改了一下初始化顺序,数据正常,可是什么也没动一段时间后又变成混乱的了。
回复

使用道具 举报

2

主题

446

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4133
金钱
4133
注册时间
2018-5-14
在线时间
902 小时
发表于 2023-4-14 16:08:16 | 显示全部楼层
状态转移条件有问题,0-1的状态转移不是时间,而且转换成功标志位,1-2的转移不需要定时器可以直接转移。
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2023-3-15
在线时间
8 小时
 楼主| 发表于 2023-4-14 16:25:03 | 显示全部楼层
本帖最后由 816t 于 2023-4-14 16:26 编辑
姚先起 发表于 2023-4-14 16:08
状态转移条件有问题,0-1的状态转移不是时间,而且转换成功标志位,1-2的转移不需要定时器可以直接转移。

我用这个代码:
while (1)
    {
                        data1=Get_ADC1(ADC_Channel_6);
                        data2=Get_ADC1(ADC_Channel_7);
                        data3=Get_ADC1(ADC_Channel_9);
      
                        OLED_ShowNum(1, 10, data1, 4);
                        OLED_ShowNum(2, 10, data2, 4);
                        OLED_ShowNum(3, 10, data3, 4);
                        Delay(20);
    }
}

uint16_t Get_ADC1(uint16_t ADC_Channel)
{
        ADC_ChannelConfig(ADC1, ADC_Channel, ADC_SampleTime_239_5Cycles);
        ADC_StartOfConversion(ADC1);
        while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
        return ADC_GetConversionValue(ADC1);
}

三个通道转换一次后,然后三个通道不停转换最后一个通道的值是为什么?
回复

使用道具 举报

0

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
133
金钱
133
注册时间
2017-1-6
在线时间
33 小时
发表于 2024-6-10 16:02:52 | 显示全部楼层
所以 貌似没有解决是吗
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 19:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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