原创 使用内部基准计算电池电压

2024-6-19 10:04 179 2 2 分类: 软件与OS 文集: AVR
代码;
hardware.c

/*
  《AVR专题精选》随书例程
  
  2.编程技巧

  项目:通过内部基准计算VCC电压
  文件:hardware.c
  说明:硬件接口函数。
        
  作者:邵子扬
  时间:2012年12月12日

*/
#include "hardware.h"
#include 

// IO 初始化
void IO_init()
{
}

// 串口初始化
void UART_init()
{
  unsigned int UBRRREG;

  UBRRREG = F_CPU / ( 8 * BAUDRATE ) - 1;
  UBRRH = UBRRREG / 256;
  UBRRL = UBRRREG % 256;
  UCSRA = ( 1 << U2X );
  UCSRB = ( 1 << TXEN );
  UCSRC = (1 << URSEL ) | ( 1 << UCSZ1 ) | ( 1 << UCSZ0 );
}

// 串口输出字符串
void UART_puts( char *s )
{
  while( *s )
  {
    UART_write( *s );
    s++;
    while( !( UCSRA & (1 << TXC )) );
    UCSRA |= ( 1 << TXC );
  }
}


void MCU_init()
{

}

// ADC初始化
void ADC_init()
{
  // AVCC做基准源,时钟8分频
  ADMUX = 0;
  ADCSRA = (1 << ADEN)|(1 << ADPS1)|(1 << ADPS0);
}

// ADC转换函数
// chn:  ADC通道号
// 返回:10位转换结果
unsigned int getADC(unsigned char chn)
{
  ADMUX = (chn % 16);
  ADCSRA = (1 << ADEN)|(1 << ADPS1)|(1 << ADPS0)|(1 << ADSC);
  while(ADCSRA & (1 << ADSC));

  return ADC;
}



main.c

/*
  《AVR专题精选》随书例程
  
  2.编程技巧

  项目:通过内部基准计算VCC电压
  文件:main.c
  说明:主程序。
        
  作者:邵子扬
  时间:2012年12月12日

*/
#include "hardware.h"

#include 
#include 

char s[30];
unsigned int Vd;

int main()
{
  // 初始化
  UART_init();
  ADC_init();

  for(;;)
  {
    // 延时
    _delay_ms(500);
	
    // read Vref
    Vd = getADC(chnTMP);
	
    // Vcc   1024
    // Vref  ADC
    // -------------------
    // Vcc = 1024*Vref/ADC
    sprintf(s, "ADC = %d,  Vcc = %ld\n\r", Vd, 1024L*VBG/Vd);	
    UART_puts(s);
  }

  return 0;
}


仿真效果图:

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
2
关闭 站长推荐上一条 /3 下一条