กรกฎาคม 19, 2018, 09:05:21 am *
ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน
ส่งอีเมล์ยืนยันการใช้งาน?

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น
   หน้าแรก   ช่วยเหลือ เข้าสู่ระบบ สมัครสมาชิก  
หน้า: [1]   ลงล่าง
  พิมพ์  
ผู้เขียน หัวข้อ: ต้องการติดต่อ ADC เบอร์ CS5526  (อ่าน 5335 ครั้ง)
0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้
binter
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 14


| |
« เมื่อ: มิถุนายน 22, 2012, 09:31:18 am »

ได้ลองเขียนโค้ดแล้ว แต่ไม่แน่ใจว่า config ค่าถูกต้องหรือเปล่าครับ จึงทำให้ค่าที่อ่านได้แกว่งมากๆ
นำ adc ไปต่อเพื่ออ่านค่าจากโหลดเซลครับ ที่ range 25 mv
Code: (c)


#define SCLK   PORTB.5   /* Shifting data to or from ADC  */
#define SDO    PINB.1    /* Transfer data from ADC to CPU */
#define SDI    PORTB.0   /* Transfer data from CPU to ADC */
#define CS     PORTB.2   /* Chip Select                   */    


#define OSET_RD     0x90   /* Offset  read command  */
#define GAIN_RD     0x92   /* Gain    read command  */
#define CONF_RD     0x94   /* Config  read command  */
#define CONV_RD     0x96   /* Data    read command  */
#define SETU_RD     0x98   /* Setup   read command  */
#define OSET_WR     0x80   /* Offset  Write command */
#define GAIN_WR     0x82   /* Gain    Write command */
#define CONF_WR     0x84   /* Config  Write command */
#define CONV_WR     0x86   /* Data    Write command */
#define SETU_WR     0x88   /* Setup   Write command */
bit ValueErr=0;
unsigned char HIGH,MID,LOW;
/* Write single byte */

void WriteByte(unsigned char dat) {
    unsigned char clock;
    for(clock=0; clock<8; clock++)
    {
        SDI  = dat & 0x80;
        dat  = dat << 1;
        SCLK = 1;      
        delay_us(1);
        SCLK = 0;    
        delay_us(1);
   }
    SDI = 0;
}
/* Read single byte */
unsigned char ReadByte(void) {
    unsigned char clock, dat;
    dat = 0;
    for(clock=0; clock<8; clock++) {
      dat  = (dat << 1);
      dat  = (dat | SDO);
        SCLK = 1;  
        delay_us(1);
        SCLK = 0;  
        delay_us(1);
   }
   return(dat);
}
/* Write register 3 bytes */
void WriteReg(unsigned char comm,unsigned char high,unsigned char mid,unsigned char low) {
    WriteByte(comm);
    WriteByte(high);
    WriteByte(mid);
    WriteByte(low);
}

/* Read register 3 bytes */
void ReadReg(unsigned char comm) {
    WriteByte(comm);
    HIGH = ReadByte();
    MID  = ReadByte();
    LOW  = ReadByte();
}

void Calibrate(void)
{
   WriteReg(CONF_WR,0x00,0x00,0x01);
   
   do{
    ReadReg(CONF_RD);      /*  Read Configuration Register   */
    }while(!(LOW & 0x08));

   ReadReg(GAIN_RD);
}

void Initialize(void) {
    unsigned int count;
    CS   = 0;
    SCLK = 0;
    //SDO  = 0;
    SDI  = 0;
    for(count=0; count<2047; count++) {
        SCLK = 1; delay_us(1);                          /* Assert SCLK */    
        SCLK = 0; delay_us(1);                                /* Deassert    */
    }
    SDI = 1;                                /* Assert SDI  */
    for(count=0; count<255; count++) {
        SCLK = 1; delay_us(1);                          /* Assert SCLK */
        SCLK = 0; delay_us(1);                          /* Deassert    */
    }
    SDI  = 0;
    SCLK = 1;delay_us(1);
    SCLK = 0;delay_us(1);

    WriteReg(CONF_WR,0x00,0x00,0x80);   /* Reset  CONF_WR = 0x84               */      
    
    //WriteReg(CONF_WR,0x00,0x00,0x40);
    //WriteReg(OSET_WR,0x00,0x00,0x00);
    //WriteReg(GAIN_WR,0x80,0x00,0x00);
    
    WriteReg(CONF_WR,0x04,0x55,0x00);    /* Initialize configuration */
      
    delay_ms(1);
    Calibrate();
}

/* Read data conversion */

 long  ReadConv(void) {
     long Value=0;  
     unsigned char OD=0,OF=0;
     WriteReg(CONF_WR,0x00,0x55,0x00);  
    WriteByte(0xC0);
    do{
    ReadReg(CONF_RD);      /*  Read Configuration Register   */
    }while(!(LOW & 0x08));
    ReadReg(CONV_RD);
    Value   = HIGH;
    Value <<= 8;
    Value  |= MID;
    Value <<= 8;
    Value  |= LOW;    
    OD =  0x02 & LOW;  
    OD >>=1;  
    OF = 0x01 & LOW;
    ValueErr =OF | OD;  
    LCError = ValueErr;
    Value >>= 8; //16 bit        
    //Value >>= 4; //20 bit  

     //if(Value>32768) Value=Value-65536;//16 bit  
   // if(Value>524288) Value=Value-1048576;//20 bit  

     return(Value);
    
}


Code: (c)

#include <mega8.h>  
#include <delay.h>
#include <stdio.h>
#include <stdlib.h>
bit LCError=0;
#include "ncs5525.h"
long RAW_LC;

#define RS485_EN        PORTD.7
#define RS485_EN_ON()   RS485_EN = 1
#define RS485_EN_OFF()  RS485_EN = 0

#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7

#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)

// USART Transmitter buffer
#define TX_BUFFER_SIZE 128
char tx_buffer[TX_BUFFER_SIZE];

#if TX_BUFFER_SIZE<256
unsigned char tx_wr_index,tx_rd_index,tx_counter;
#else
unsigned int tx_wr_index,tx_rd_index,tx_counter;
#endif

// USART Transmitter interrupt service routine
interrupt [USART_TXC] void usart_tx_isr(void)
{
if (tx_counter)
   {
   --tx_counter;
   UDR=tx_buffer[tx_rd_index];
   if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0;
   };
}

#ifndef _DEBUG_TERMINAL_IO_
// Write a character to the USART Transmitter buffer
#define _ALTERNATE_PUTCHAR_
#pragma used+
void putchar(char c)
{
while (tx_counter == TX_BUFFER_SIZE);
#asm("cli")
if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0))
   {
   tx_buffer[tx_wr_index]=c;
   if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
   ++tx_counter;
   }
else
   UDR=c;
#asm("sei")
}
#pragma used-
#endif


main(){
delay_ms(500);
// Input/Output Ports initialization
// Port B initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=In Func0=Out
// State7=0 State6=0 State5=1 State4=0 State3=0 State2=1 State1=P State0=1
PORTB=0x00;
DDRB=0xFD;// 1111 1101

PORTC=0x00;
DDRC=0x00;

PORTD=0x00;
DDRD=0x80;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 125.000 kHz
//TCCR0=0x03;
//TCNT0=0x83;      //=256-(125 kHz x 1 mS)

//TIMSK=0x01;
TIMSK=0x00;

UCSRA=0x00;
UCSRB=0x48;//96
UCSRC=0x86;//86
UBRRH=0x00;
UBRRL=0x33;

delay_ms(500);
Initialize();
delay_ms(10);

while(1){
    RAW_LC = ReadConv();
    //RAW_LC = 12345;
    RS485_EN_ON();
    delay_ms(100);
    
    putchar((RAW_LC/10000000)+'0');
    putchar((unsigned char)((RAW_LC/100000)%10)+'0');
    putchar((unsigned char)((RAW_LC/10000)%10)+'0');
    
    putchar((unsigned char)((RAW_LC/1000)%10)+'0');
    putchar((unsigned char)((RAW_LC/100)%10)+'0');
    putchar((unsigned char)((RAW_LC/10)%10)+'0');
    putchar((unsigned char)((RAW_LC%10))+'0');
    putchar(' ');
    
    delay_ms(500);
    RS485_EN_OFF();
    delay_ms(500);
}
}

บันทึกการเข้า
binter
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 14


| |
« ตอบ #1 เมื่อ: มิถุนายน 22, 2012, 03:39:49 pm »

ประเด็นคือ ต้องการต่อกับโหลดเซลโดยตรง แล้วต้องการให้ ADC ทำงานย่าน 25 mv แต่ผมไม่รู้ว่าต้องตั้งค่า Register GAIN,OFFSET,CONFIG ใน ADC ค่าเท่าไรครับ
บันทึกการเข้า
ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8272


ShadowWares


| |
« ตอบ #2 เมื่อ: มิถุนายน 22, 2012, 06:21:28 pm »

ผมไม่ได้อ่าน datasheet จึงของถามก่อนว่า code ส่วนนี้
Code: (c)
    WriteReg(CONF_WR,0x00,0x55,0x00);    
    WriteByte(0xC0);  
    do{  
        ReadReg(CONF_RD);      /*  Read Configuration Register   */  
    }while(!(LOW & 0x08));

แต่และบรรทัดหมายความว่าอะไรครับ ไม่ต้องอธิบายให้ละเอียดละเอียดมาก แต่ขอแบบชัดเจน
บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
binter
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 14


| |
« ตอบ #3 เมื่อ: มิถุนายน 23, 2012, 03:55:26 pm »


WriteReg(CONF_WR,0x00,0x55,0x00);   เป็นการตั้งค่าการต่างเช่น range ของ input, ความเร็วในการแปลง เป็นต้น
 WriteByte(0xC0);  สั่งให้เริ่มแปลง
do{  
        ReadReg(CONF_RD);      /*  Read Configuration Register   */    อ่านค่าจาก register เพื่อเช็คว่า แปลงค่าเสร็จหรือยัง
    }while(!(LOW & 0x08));       เช็คว่าแปลงเสร็จหรือยัง
บันทึกการเข้า
ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8272


ShadowWares


| |
« ตอบ #4 เมื่อ: มิถุนายน 23, 2012, 04:05:59 pm »

ตอนนี้ผมจะสมมุิตว่าคุณทำการกำหนดค่าทุกอย่างของ IC ตัวนี้ถูกต้องแล้ว

กลับมาว่ากันที่เรื่องของการเกว่งต่อ
ตอนนี้ถ้าหากนำขา input ต่อกับ ground ค่าที่ได้เป็น 0 นิ่งหรือเปล่า?
ต่อกับแรงดันคงที่ค่าใดๆ  ค่าที่ได้ นิ่งหรือเปล่า?

หากสองกรณีนี้นิ่ง Circuit Design (Noise), Input impedance และ Sampling frequency คือสิ่งที่ต้องให้ความสำคัญในลำดับต่อไป
บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
binter
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 14


| |
« ตอบ #5 เมื่อ: กรกฎาคม 05, 2012, 11:23:59 am »

ถ้าหากนำขา input ต่อกับ ground ค่าที่ได้เป็น 0 นิ่งครับ
ถ้าต่อกับแรงดันคงที่ค่าใดๆ  ค่าที่ได้จะไม่นิ่งครับ
บันทึกการเข้า
ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8272


ShadowWares


| |
« ตอบ #6 เมื่อ: กรกฎาคม 06, 2012, 07:35:22 pm »

วงจรคุณไม่น่าไว้วางใจแล้วหละครับ
แรงดันค่าคงที่ใดๆ มันคือ DC และ DC จะไม่ก่อให้เกิดสัญญาณ Pulse ที่ทำให้ Counter เกิดการนับได้ (ทั้งนี้ต้องมั่นใจว่าโปรแกรมไม่ผิด)
บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
หน้า: [1]   ขึ้นบน
  พิมพ์  
 
กระโดดไป: