[CW32F003系列]

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

[复制链接]
262|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 | 显示全部楼层
属实会有可能程序的执行顺序,会导致数据的不正确性

使用特权

评论回复
Betty996| | 2022-12-27 17:30 | 显示全部楼层
能把你的程序工程发出来么,让大家帮你看看

使用特权

评论回复
Estelle1999| | 2022-12-27 18:01 | 显示全部楼层
感觉还是程序执行顺序的问题,导致数据不准确

使用特权

评论回复
Emily999| | 2022-12-27 19:16 | 显示全部楼层
你可以问问他家的FAE啊,他家技术支持还是可以的

使用特权

评论回复
alxd| | 2022-12-28 07:02 | 显示全部楼层
有没有官方的程序例程啊,感觉ADC应该不会这么麻烦才对

使用特权

评论回复
Annie556| | 2022-12-28 08:25 | 显示全部楼层
基准电压这种配置属实麻烦,配置不好的话,数据也不准

使用特权

评论回复
Charlotte夏| | 2022-12-28 10:34 | 显示全部楼层
那你换一组ADC的IO呢?比如ADC0,用特殊配置的,ADC1用普通序列转换呢?

使用特权

评论回复
Belle1257| | 2022-12-28 12:56 | 显示全部楼层
您仿真跟踪一下吧,看看程序逻辑怎么执行的,也许能找到原因

使用特权

评论回复
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,读出结果是一样的,明明序列转换又开始了啊。

使用特权

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

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

使用特权

评论回复
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

使用特权

评论回复
MessageRing| | 2023-1-3 14:11 | 显示全部楼层
是不是程序执行顺序的问题啊

使用特权

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

本版积分规则