STM32
直播中

杜喜喜

7年用户 1498经验值
私信 关注
[问答]

STM8S105S4的AD模拟狗问题,设置上下限后不能触发怎么解决?

请教大家,我在使用STM8S105S4的AD转换时,AD转换已经可以正常工作,但在启用模拟狗时,实际电压远远超过上限电压时,AWD位总是无法置1。
我用的是IAR,发现设置好ADC_HTRL=0x01;  ADC_HTRH=0xf5;后,打开IAR的寄存器监视,里面显示出却是高低位反过来了。试过用库函数也是一样。
。比如我程序里设置ADC_HTRL=0x01;    ADC_HTRH=0xf5;后,这样计算,上限电压是2.45。AD转换后显示的电压达到3.2V了AWD都还没置1请问这是什么原因?
全部代码如下:

  • #include "iostm8s105s4.h"
  • #include

  • void Clock_Config(void);
  • void AD_Config(void);
  • void AD_Read(void);
  • void delay_us(unsigned int nCount);
  • void delay_ms(unsigned int nCount);

  • int main(void){
  •     Clock_Config();
  •     AD_Config();
  •     while(1){
  •       AD_Read();
  •       if(ADC_CSR_AWD==1)
  •       {printf("%sn","Vol UP!!!");ADC_CSR_AWD=0;}
  •       delay_ms(1000);
  •     }
  • }

  • void Clock_Config(void){
  •     //==启用外部晶振.不分频。
  •     CLK_ECKR=0x01;//HSE开
  •     CLK_ICKR=0x00;
  •     while(CLK_ECKR!=0x03);//等待HSE准备就绪
  •     CLK_SWR=0xb4;//设置HSE为主时钟源
  •     CLK_SWCR=0x03;//使能时钟切换,禁止时钟中断
  •     while(!(CLK_SWCR  0x08));    // 等待切换至HSE完成
  • }

  • void AD_Config(void){
  •     ADC_CSR_CH=0x09;//选择通道9;
  •     ADC_CR1|=0x00;//fadc=fmaster/2,单次转换,A/D关

  •     ADC_TDRH|=0x02;
  •     ADC_TDRL|=0x00;//关闭通道9的施密特触发器

  •     ADC_HTRL=0x01;
  •     ADC_HTRH=0xf5;

  •     ADC_LTRL=0x00;//设定AD模拟狗上限电压为2V,下限电压为0;
  •     ADC_LTRH=0x00;

  •     ADC_CR2_EXTTRIG=0;//禁止外部触发
  •     ADC_CR2_ALIGN=1;//数据右对齐

  •     ADC_CR1_ADON=1;//使能AD;
  •     ADC_CSR_AWDIE=1;//使能模拟看门狗
  • }

  • void AD_Read(void){
  •     unsigned int ADVal_1=0;
  •     float ADVal_10=0;
  •     float AD_Temp=0;
  •     float ADVal=0;
  •     unsigned int TempL=0;
  •     unsigned int TempH=0;

  •   for(unsigned char i=0;i<10;i++){
  •         delay_ms(10);
  •         ADC_CR1_ADON=1;//开始转换;
  •         while(0==ADC_CSR_EOC);//等待转换完成
  •         ADC_CSR_EOC=0;  //清除AD完成标志位
  •         TempL=ADC_DRL;
  •         TempH=ADC_DRH<<8;
  •         ADVal_1 = TempL|TempH;
  •         AD_Temp=AD_Temp+ADVal_1;
  •   }

  •     ADVal_10=AD_Temp/10;//取10次平均值
  •     ADVal=(ADVal_10*500)/1023;//*100用来防止损失位

  •     int b=(int)(ADVal/100);
  •     int c=(int)(ADVal-b*100);

  •     printf("v=%d.%.2dn",b,c);
  • }


  • void delay_us(unsigned int nCount)
  • {
  •     nCount *= 2;
  •     while(--nCount){     asm("nop");asm("nop");
  •     };
  • }

  • void delay_ms(unsigned int nCount)
  • {
  •     while(nCount--)
  •     {
  •         delay_us(1000);
  •     }
  • }


回帖(1)

郝埃连

2024-5-6 17:04:28
首先,我们需要确保STM8S105S4的AD转换和模拟狗功能已经正确配置。以下是一些可能的解决方案:

1. 确保ADC通道已经正确配置。检查ADC通道的输入引脚是否正确连接到模拟信号源。

2. 确保时钟配置正确。STM8S105S4的ADC时钟需要正确配置,以确保AD转换的精度和速度。请检查你的`Clock_Config`函数是否正确设置了时钟。

3. 检查ADC配置。确保你已经正确设置了ADC的触发方式、分辨率、数据对齐等参数。

4. 检查模拟狗阈值设置。你提到的问题可能是由于模拟狗阈值设置不正确导致的。请确保你已经正确设置了ADC_HTR和ADC_LTR寄存器的值。你可以尝试以下设置:

```c
ADC_HTRL = 0x00; // 设置低阈值的低字节
ADC_HTRH = 0x00; // 设置低阈值的高字节
ADC_LTRH = 0xFF; // 设置高阈值的高字节
ADC_LTRL = 0xFF; // 设置高阈值的低字节
```

这将设置低阈值为0V,高阈值为最大值(取决于ADC分辨率)。

5. 检查AWD中断。确保你已经正确配置了AWD中断,并在中断服务程序中处理AWD事件。

6. 检查IAR编译器设置。确保你的IAR项目设置正确,没有导致寄存器值翻转的问题。

7. 如果问题仍然存在,请尝试使用STM8S标准外设库或STM8S Discovery套件提供的示例代码,以确保你的代码没有逻辑错误。

8. 如果以上方法都不能解决问题,建议联系STMicroelectronics的技术支持,他们可能会提供更专业的帮助。

希望这些建议能帮助你解决STM8S105S4的AD模拟狗问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分