اندازه گیر ولتاژ 0تا30ولت با میگا8 و نمایشگر سون سگمنت

در اين بخش مي‌توانيد طرح آماده و کامل شده مرتبط با میکروکنترلرهای AVR را مشاهده بفرمایید

مدیران انجمن: SAMAN, sinaset, شوراي نظارت

ارسال پست
Colonel II
Colonel II
نمایه کاربر
پست: 7013
تاریخ عضویت: سه شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9183 بار
سپاس‌های دریافتی: 21046 بار
تماس:

اندازه گیر ولتاژ 0تا30ولت با میگا8 و نمایشگر سون سگمنت

پست توسط sinaset » دو شنبه 18 آبان 1394, 3:21 pm

با سلام

اندازه گیر ولتاژ 0تا30ولت با میگا8 و نمایشگر سون سگمنت تصویر 

همانجور که اطلاع دارید،به کمک واحد ADC (آنالوگ به دیجیتال) می توانید ولتاژ 0 تا 5 ولت را با دقت 10 بیت اندازه بگیرید .. در این پروژه ساده به کمک تقسیم مقاومتی، نرخ اندازه گیری ولتاژ (با کمی دقت کمتر ) به 30 ولت ارتقاع یافته. سپس می توانید آن را به روی نمایشگر سون سگمنت نمایش دهید ..
 تصویر  مدار اصلی،ولتی متر 0 تا 30 ولت. 
در این پروژه جالب، برای ساده تر شدن کار از دو کتابخانه نوشته شده، برای سون سگمنت و اندازگیری ولتاژ، استفاده شده


کدهای صفحه اصلی برنامه

کد: انتخاب همه

#include <mega8.h>
#include <delay.h>
#include "indicator.h"    //فراخواني کتابخانه
#include "adc.h"        //فراخواني کتابخانه
#define TCNT0_const 0xd9

void main( void )
{
  unsigned int voltage;
  IND_Init();
  ADC_Init();
  TIMSK = (1<<TOIE0);
  TCCR0 = (1<<CS02)|(0<<CS01)|(1<<CS00);
  TCNT0 = TCNT0_const;   
  #asm("sei"); 
  while(1){
    voltage = ADC_GetBuf();      //فراخواني کتابخانه اندازه گيري ولتاژ
    voltage = ((unsigned long)voltage * 3101)/1023;  //
    IND_Output(voltage, 2);    //نمايش ولتاژ بر روي سون سگمنت
    delay_ms(100);        //زمان تاخير
  }
}
interrupt [TIM0_OVF] void Tim0OvfVect(void)    //اور فلو تايمر 0
{
  TCNT0 = TCNT0_const;    //مقداري دهي واحد تايمر 0
  IND_Update();         //اپديت کردن داده هاي سون سگمنت
}


کتابخانه و کدهای قسمت سون سگمنت

کد: انتخاب همه

#ifndef INDICATOR_H
#define INDICATOR_H
#include <mega8.h>

#define PORT_IND PORTB   
#define DDR_IND DDRB      //تايين پورت بي به عنوان سون سگمنت

#define PORT_TR PORTD
#define DDR_TR DDRD      //تايين پورت دي به عنوان 4 پايه مشترک سون سگمنت

#define NUM1 0
#define NUM2 1
#define NUM3 2
#define NUM4 3

#define SEG_A 0
#define SEG_B 1
#define SEG_C 2
#define SEG_D 3
#define SEG_E 4
#define SEG_F 5
#define SEG_G 6
#define SEG_DP 7

void IND_Init(void);   // IND_Init
void IND_Output(unsigned int value, unsigned char comma);  // IND_Output
void IND_Update(void);  //IND_Update
#endif //INDICATOR_H


کدهای کتابخانه سون سگمنت.

کد: انتخاب همه

#include "indicator.h"
#define AMOUNT_NUM 4
#define LightOutAll()  PORT_TR &= ~((1<<NUM1)|(1<<NUM2)|(1<<NUM3)|(1<<NUM4))
#define BurnDigit(port, digit) port |= (1<<digit) 
#define ValueBuf() buf[count]

volatile unsigned char buf[AMOUNT_NUM];
unsigned char number[] =               //آرايه اعداد 0 تا 9
{
  (1<<SEG_A)|(1<<SEG_B)|(1<<SEG_C)|(1<<SEG_D)|(1<<SEG_E)|(1<<SEG_F)|(0<<SEG_G), //0
  (0<<SEG_A)|(1<<SEG_B)|(1<<SEG_C)|(0<<SEG_D)|(0<<SEG_E)|(0<<SEG_F)|(0<<SEG_G), //1
  (1<<SEG_A)|(1<<SEG_B)|(0<<SEG_C)|(1<<SEG_D)|(1<<SEG_E)|(0<<SEG_F)|(1<<SEG_G), //2
  (1<<SEG_A)|(1<<SEG_B)|(1<<SEG_C)|(1<<SEG_D)|(0<<SEG_E)|(0<<SEG_F)|(1<<SEG_G), //3   
  (0<<SEG_A)|(1<<SEG_B)|(1<<SEG_C)|(0<<SEG_D)|(0<<SEG_E)|(1<<SEG_F)|(1<<SEG_G), //4
  (1<<SEG_A)|(0<<SEG_B)|(1<<SEG_C)|(1<<SEG_D)|(0<<SEG_E)|(1<<SEG_F)|(1<<SEG_G), //5
  (1<<SEG_A)|(0<<SEG_B)|(1<<SEG_C)|(1<<SEG_D)|(1<<SEG_E)|(1<<SEG_F)|(1<<SEG_G), //6
  (1<<SEG_A)|(1<<SEG_B)|(1<<SEG_C)|(0<<SEG_D)|(0<<SEG_E)|(0<<SEG_F)|(0<<SEG_G), //7   
  (1<<SEG_A)|(1<<SEG_B)|(1<<SEG_C)|(1<<SEG_D)|(1<<SEG_E)|(1<<SEG_F)|(1<<SEG_G), //8
  (1<<SEG_A)|(1<<SEG_B)|(1<<SEG_C)|(1<<SEG_D)|(0<<SEG_E)|(1<<SEG_F)|(1<<SEG_G)  //9   
};
//***********************************************************************************
void IND_Init(void)
{
  unsigned char i;
  PORT_IND = 0xff;
  DDR_IND = 0xff;
  PORT_TR |= (1<<NUM1)|(1<<NUM2)|(1<<NUM3)|(1<<NUM4);
  DDR_TR |= (1<<NUM1)|(1<<NUM2)|(1<<NUM3)|(1<<NUM4);
  for(i = 0; i < AMOUNT_NUM; i++) buf[I] = 0;
}
//************************************************************************
void IND_Output(unsigned int value, unsigned char comma)
{
  unsigned char i;
  unsigned char tmp;
  for(i = 0; i < AMOUNT_NUM; i++){
    tmp = value % 10;
    buf[I] = number[tmp];
    value = value/10;
  }
  if (comma < AMOUNT_NUM) {
    buf[comma] |= 1<<(SEG_DP);
  }   
}
//***********************************************************************
void IND_Update(void)    //ريفريش کردن سون سگمنت
{
  static unsigned char count = 0;
  PORT_IND = 0;
  LightOutAll();
  if (count == 0) BurnDigit(PORT_TR, NUM1);
  else if (count == 1) BurnDigit(PORT_TR, NUM2);
  else if (count == 2) BurnDigit(PORT_TR, NUM3);
  else BurnDigit(PORT_TR, NUM4);
  PORT_IND = ValueBuf();
  count++;
  if (count == AMOUNT_NUM) count = 0;
}

کتابخانه خواندن ولتاژ

کد: انتخاب همه

#ifndef ADC_H
#define ADC_H
#include <mega8.h>

void ADC_Init(void);      
unsigned int ADC_GetBuf(void);   
#endif //ADC_H

کدهای کتابخانه خواندن ولتاژ

کد: انتخاب همه

#include "adc.h"
//******************************************************************************
void ADC_Init(void)
{
  ADMUX = (1<<REFS1)|(1<<REFS0)|(0<<ADLAR)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0);
  ADCSR = (1<<ADEN)|(1<<ADSC)|(0<<ADFR)|(1<<ADIE)|(1<<ADPS2)|(0<<ADPS1)|(0<<ADPS0);
  ADCSR |= (1<<ADSC); 
}
//******************************************************************************
volatile unsigned int adcValueBuf = 0;
interrupt [ADC_INT] void AdcVect(void)
{
  unsigned int adcTemp;
  static unsigned int adcValue = 0;
  static unsigned char count = 0;

  adcTemp = ADCL;
  adcTemp |=((unsigned int)ADCH<<8); 
  adcValue  += adcTemp; 
  count++;
  if (count == 8){
    adcValueBuf = (adcValue>>3);
    adcValue = 0;
    count = 0;
  }
  ADCSR |= (1<<ADSC);
}
//*****************************************************************************
unsigned int ADC_GetBuf(void)
{
  unsigned int tmp;
  unsigned char saveState = SREG;
  #asm("cli");
  tmp = adcValueBuf;
  SREG = saveState;
  return tmp;
}


[لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید]فایل و شماتیک و شبیه ساز (برای پرتئوس 8 و 7)
منبع برنامه ChipEnable.Ru
باتشکر[/I][/I]
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

New Member
پست: 2
تاریخ عضویت: دو شنبه 6 دی 1395, 10:21 pm
سپاس‌های ارسالی: 1 بار
سپاس‌های دریافتی: 2 بار

Re: اندازه گیر ولتاژ 0تا30ولت با میگا8 و نمایشگر سون سگمنت

پست توسط bahram_diba » یک شنبه 12 دی 1395, 7:16 pm

واقعا عالی بود و پر کاربرد . واقعا ممنونم.... کلی از سوالام جواب داده شد!!!!____ هممیشه موفق و پیروز باشید. :smile: :( :razz: :razz: :razz:

ارسال پست

بازگشت به “طرح آماده و کامل شده AVR”