打印
[CW32F003系列]

ADC从单次通道切换到单次序列,序列的RESULT0读数出错

[复制链接]
1088|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhanan|  楼主 | 2022-12-24 10:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有一个通道因为基准电压等有特殊设置,所以单独分出一路用单次单通道解决,其余的通道用序列转换。
但是,序列转换结果,RESULT0的读数不对,仍然是前面单通道的结果。前面单次单通道的数据读了以后才启动序列转换的啊。
如果把序列转换放在前面,第一次正确,单通道用过后,又不正确了。

使用特权

评论回复
沙发
Allison8859| | 2022-12-27 13:56 | 只看该作者
你可以用官方的demo跑一下,看看是不是数据还不正确啊?

使用特权

评论回复
板凳
Carmen7| | 2022-12-27 15:14 | 只看该作者
感觉是配置的事儿呢,基准电压等特殊配置您咋配置的啊?

使用特权

评论回复
地板
B1lanche| | 2022-12-27 16:22 | 只看该作者
属实会有可能程序的执行顺序,会导致数据的不正确性

使用特权

评论回复
5
Betty996| | 2022-12-27 17:30 | 只看该作者
能把你的程序工程发出来么,让大家帮你看看

使用特权

评论回复
6
Estelle1999| | 2022-12-27 18:01 | 只看该作者
感觉还是程序执行顺序的问题,导致数据不准确

使用特权

评论回复
7
Emily999| | 2022-12-27 19:16 | 只看该作者
你可以问问他家的FAE啊,他家技术支持还是可以的

使用特权

评论回复
8
alxd| | 2022-12-28 07:02 | 只看该作者
有没有官方的程序例程啊,感觉ADC应该不会这么麻烦才对

使用特权

评论回复
9
Annie556| | 2022-12-28 08:25 | 只看该作者
基准电压这种配置属实麻烦,配置不好的话,数据也不准

使用特权

评论回复
10
Charlotte夏| | 2022-12-28 10:34 | 只看该作者
那你换一组ADC的IO呢?比如ADC0,用特殊配置的,ADC1用普通序列转换呢?

使用特权

评论回复
11
Belle1257| | 2022-12-28 12:56 | 只看该作者
您仿真跟踪一下吧,看看程序逻辑怎么执行的,也许能找到原因

使用特权

评论回复
12
zhanan|  楼主 | 2022-12-29 10:06 | 只看该作者
程序:
  ADC->CR0 = (ADC->CR0 & 0xC000)|0x22D1; // 单次单通道,VCC基准
  ADC->CR1 = 0x0F; // 1.2V通道
  while((ADC->ISR & 0x80)==0); // 等ADC就绪
  ADC->START = 0x01; // 启动转换
  while(ADC->START & 0x01); // 等单通道转换完成
  nvr[0]=ADC->RESULT0; // 读1.2V结果

  ADC->SQR = 0x03C357; // 序列配置: SV电流,JR电流,KX电压,WD电压
  ADC->CR0 = (ADC->CR0 & 0xC000)|0x2219; // 单次序列,1.5V基准
  ADC->START = 0x03; // ADC启动,完成后关闭ADC
  while(ADC->START & 0x01); // 等序列转换完成
  nsv[0]=ADC->RESULT0; // sv电流检测
  njr[0]=ADC->RESULT1; // JR电流检测
  nkx[0]=ADC->RESULT2; // KX电压
  nwd[0]=ADC->RESULT3; // WD电压

单通道的RESULT0和序列的RESULT0,读出结果是一样的,明明序列转换又开始了啊。

使用特权

评论回复
13
zhanan|  楼主 | 2022-12-29 10:26 | 只看该作者
Charlotte夏 发表于 2022-12-28 10:34
那你换一组ADC的IO呢?比如ADC0,用特殊配置的,ADC1用普通序列转换呢?

换通道,除了RESULT0,数都跟着变,但序列的RESULT0仍然是上次单通道的,序列的别的通道结果也对,序列转换进行了,RESULT0的值没更新。

使用特权

评论回复
14
zhanan|  楼主 | 2022-12-29 10:37 | 只看该作者
有一个小发现,在序列转换启动前,把ADC->START.START位写一下0,尽管在启动前,该位已经是0了,结果就对了。
  //单通道...
  // 序列
  ADC->SQR = 0x03C357; // 序列配置: SV电流,JR电流,KX电压,WD电压
  ADC->CR0 = (ADC->CR0 & 0xC000)|0x2219; // 单次序列,1.5V基准

  ADC->START = 0;  // 增加这一句,似乎是多余的,但有用。起作用的是位0-START,单独把位0写0也可以,此刻位1-AUTOSTOP也是0,不如一起写0了。

  ADC->START = 0x03; // ADC启动,完成后关闭ADC

使用特权

评论回复
15
MessageRing| | 2023-1-3 14:11 | 只看该作者
是不是程序执行顺序的问题啊

使用特权

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

本版积分规则

10

主题

183

帖子

0

粉丝