Main Menu
Menu

Show posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Show posts Menu

Messages - crywolf

#17
น่าจะมีสัญญาณออกมามั้งนะ ลองแบบนี้ดูครับ

  while(HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY);
  while(HAL_I2C_IsDeviceReady(&hi2c1, 0xA0, 20, 100) != HAL_OK);

  if(HAL_I2C_Mem_Write(&hi2c1, 0xA0, 0, 1, &my_data[0], 3, 100) != HAL_OK)
    {
      Error_Handler();
    }

  if(HAL_I2C_Mem_Read(&hi2c1, 0xA0, 0, 1, &my_data_receive[0], 3, 100) != HAL_OK)
    {
      Error_Handler();
    }
#18
ขา Address ของ IC ต่อยังไงครับ Address Hardware กับ Software ตรงกันป่าว
i2c initial ถูกรึป่าวครับ Config ขาสัญญาณตรงรึป่าว

เอาไฟล์มาดูหน่อยครับ
#19
เปลี่ยนค่า R2 กับ R3 ครับ ใช้สัก 1Kohm ทั้ง 2 ตัว
ถ้ายังติดอยู่ลองเช็คว่า PWM เป็น 0 มัน 0 จริงๆรึป่าว
หรือยังมีพัลล์ออกมา ลองถอดสัญญาณ PWM ออกดูครับ
#20
ผมทำไว้นานแล้ว

https://www.youtube.com/v/cjEeiKVRsrA



#include <avr/io.h>

/* USI port and pin definitions.
*/
#define USI_DIR_REG                DDRB        //!< USI port direction register.
#define USI_IN_REG                PINB        //!< USI port input register.
#define USI_OUT_REG                PORTB        //!< USI port output register.

#define USI_SS_PIN                PB3                //!< USI slave select pin.
#define USI_SCK_PIN                PB2                //!< USI clock I/O pin.
#define USI_DO_PIN                PB1                //!< USI data output pin.
#define USI_DI_PIN                PB0                //!< USI data input pin.

int main( void )
{
        unsigned int delay=1023;
        unsigned char last_led=15, i, j, pwm_ch[8], pwm_count=0;;
        unsigned char duty_ch[64]={        255,239,223,207,191,175,159,143,
                                                                127,111, 95, 79, 63, 47, 31, 15 };

        USI_DIR_REG = (1<<USI_SS_PIN)|(1<<USI_SCK_PIN)|(1<<USI_DO_PIN);
        // Configure USI to 3-wire master mode
        USICR = (1<<USIWM0);

        while(1)
        {
                if( --delay == 0 )
                {
                        delay = 64;
                        for( i=last_led; duty_ch[i] != 0; i=(i-1)&63)
                        {
                                --duty_ch[i];
                        }
                        if( duty_ch[last_led] == 0 )
                        {
                                --duty_ch[i];
                                last_led = (last_led-1)&63;
                        }
                }

                for( i=last_led; duty_ch[i] != 0; i=(i-1)&63)
                {
                        if( duty_ch[i] == pwm_count )
                        {
                                pwm_ch[i>>3] &= ~(1<<(7-(i%8)));
                        }
                }

                if( --pwm_count == 0 )
                {
                        for( i=0; i<8; i++ )
                        {                               
                                pwm_ch[i] = 0xff;                // Off
                        }
                }

                for( j=0; j<8; j++ )
                {
                        USIDR = pwm_ch[j];

                        for( i=8; i!=0; i-- )
                        {
                                USICR |= (1<<USITC);
                                USICR |= (1<<USICLK);
                                USICR |= (1<<USITC);
                        }
                }
               
                USI_OUT_REG |= (1<<USI_SS_PIN);
                USI_OUT_REG &= ~(1<<USI_SS_PIN);
        }
}


#21
ต้องทำความเข้าใจใหม่นะครับ
CPU มันไม่เต็มหรอกครับ มันมีแต่ทำงาน (100%) กับไม่ทำงาน (0%)
เมื่อมันทำงาน ไม่ว่าจะคำสั่งเดียว หรือล้านคำสั่ง มันก็ทำงาน 100% เหมือนกัน
เมื่อไม่ต้องการให้มันทำงาน ก็ต้องเปลี่ยนโหมดมัน เป็น idle mode หรือ sleep mode

ถามว่า
  แล้วทำไมถึงบอกได้ว่า CPU ทำงานกี่ %
ตอบ
  การคำนวนหา % การทำงานของ CPU จะเอาเวลาเป็นตัวกำหนด
เช่น ใน 1 วินาที CPU ทำงานใช้เวลาไปเท่าไหร่ แล้ว เข้า sleep mode ใช้เวลาไปเท่าไหร่
สมมุติว่า ทำงาน 0.2 วินาที่ แล้ว sleep ไป 0.8 วินาที จะได้ 0.2/(0.2+0.8) * 100 = 20%

#22
เข้าใจผิดแล้วครับ 0.707 ไม่ใช่ความละเอียดครับ ไปเปลี่ยนไม่ได้ครับ
ตัวนี้คือ การแปลงค่า กระแสไฟฟ้าที่เป็น AC ให้ออกมาเป็น RMS ครับ
ส่วน 0.074 ที่ผมบอกไป เพื่อแสดงให้เห็นว่า การออกแบบการวัดแบบนี้ความละเอียดจะต่ำครับ
#23
เพิ่ม analogReference(DEFAULT); ไปด้วยครับ

เป็น

void setup() {
Serial.begin(9600);
analogReference(DEFAULT);
}


เนื่องจาก Arduino มี ADC ความละเอียดแค่ 10-Bit (0-1023)
เมื่อเอามาใช้กับ Vref +5V ทำให้ ได้ความละเอียด 4.88mv/Bit
และเมื่อใช้กับ ACS712-30A (66mV/A)
ทำให้การวัดกระแส จะได้ความละเอียด 0.074 Amp/Bit
#24
ขา AREF ต่อยังไงครับ ต้องต่อ AREF กับ +5V นะครับ
หรือไม่ก็เซ็ต ADMUX เป็น  ADMUX= ADMUX | 0x40;