【问题标题】:ATtiny402 ADC value comming not properlyATtiny402 ADC 值不正确
【发布时间】:2023-02-12 01:35:59
【问题描述】:

在 ATtiny402 中,当它打开 +2.5v 时,没有增量 ADC 值。当它达到相应的 +2.5v 时,它停留在最大 adc 值上……即使我将 trimpot 调整到 2.5v 以上也没有变化。这是代码。

#include <avr/io.h> #include <util/delay.h> uint16_t volatile adcVal;

void ADC0_init(void); uint16_t ADC0_read(void);

void ADC0_init(void) { /* Disable digital input buffer */ PORTA.PIN6CTRL &= ~PORT_ISC_gm; PORTA.PIN6CTRL |= PORT_ISC_INPUT_DISABLE_gc;

  /* Disable pull-up resistor */
PORTA.PIN6CTRL &= ~PORT_PULLUPEN_bm;


ADC0.CTRLB = VREF_ADC0REFEN_bm ;
VREF.CTRLA = VREF_ADC0REFSEL_1_bm;  


ADC0.CTRLC |= ADC_PRESC_DIV4_gc      /* CLK_PER divided by 4 */
           | ADC_REFSEL_INTREF_gc;  /* Internal reference */


ADC0.CTRLA |= ADC_ENABLE_bm          /* ADC Enable: enabled */
           | ADC_RESSEL_10BIT_gc;   /* 10-bit mode */

/* Select ADC channel */
ADC0.MUXPOS  = ADC_MUXPOS_AIN6_gc;

}

uint16_t ADC0_read(void) { /* Start ADC conversion */ ADC0.COMMAND = ADC_STCONV_bm;

/* Wait until ADC conversion done */
while ( !(ADC0.INTFLAGS & ADC_RESRDY_bm) )
{
    ;
}

/* Clear the interrupt flag by writing 1: */
ADC0.INTFLAGS = ADC_RESRDY_bm;
return ADC0.RES;

}

【问题讨论】:

    标签: c avr attiny


    【解决方案1】:

    这将写入一个设置了 ADC0REFSEL_1 位的掩码并启用 2.5V 参考电压。

    VREF.CTRLA = VREF_ADC0REFSEL_1_bm;  
    

    ADC 无法测量高于参考的电压。 尝试不同的值或启用 VDD 作为 ADC0.CTRLC 的参考

    【讨论】:

    • 您还可以通过向 ADC 提供比 Vref 高得多的电压来炸毁 ADC。
    • 我已经按照你说的改变了,但仍然有一些问题..当输入的 0v 和 adc 值变得更高时,输出为 adc 值 = 0,当输入甚至为 0.5v 时,输出值大于 1024
    • @ashwin_mani 请仔细检查 ATtiny402 数据表和您的代码。内部参考可以提供 0.55V(默认状态下为VREF.CTRLAADC0REFSEL[2:0] == 0)。看起来 ADC0.CTRLC 配置为内部参考,VREF.CTRLA 配置为 0.55V
    • @ReAl 先生,谢谢您……并改变了一些东西……在这些问题解决之后……即使有一些疑问……请澄清一下……我将发布当前代码
    • 我得到了一个没有这个(ADC0.RES &gt;&gt; 2)的十进制值4092 ...在我做了这个2位右移之后我得到了1024 ...我不明白到底发生了什么...右移对于获得1024是必不可少的......以及为什么仅在 2 位移位后才起作用……请解释一下……@ReAl
    【解决方案2】:

    关于评论中的第二个问题。

    我得到了一个没有这个的十进制值 4092 (ADC0.RES >> 2) ......为什么它只在 2 位移位后才起作用

    答案是很长时间才能将其放入评论中。 您在这里使用 ADC0.CTRLB 而不是 VREF.CTRLB 有误

    ADC0.CTRLB = VREF_ADC0REFEN_bm;
    

    所以VREF_ADC0REFEN_bm等于2被写入SAMPNUMADC控制字段并且启用ACC4模式。这意味着在它发出的每个 ADC 转换请求中转换本身并放置进入ADC结果寄存器。所以你应该将结果除以 4 得到你期望的结果。

    VREF 仍然有效,因为(不存在)线

    VREF.CTRLB = VREF_ADC0REFEN_bm;
    

    只是设置永恒的启用 ADC0REF 输出。如果没有此代码行,输出将由 ADC 请求自动启用,但这需要更多的设置时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-18
      • 2020-11-12
      • 2015-05-25
      • 2021-11-20
      • 2019-11-12
      • 2015-09-10
      • 2016-10-16
      • 2015-02-01
      相关资源
      最近更新 更多