สิงหาคม 18, 2017, 07:46:11 pm *
ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน
ส่งอีเมล์ยืนยันการใช้งาน?

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น
   หน้าแรก   ช่วยเหลือ เข้าสู่ระบบ สมัครสมาชิก  
หน้า: [1]   ลงล่าง
  พิมพ์  
ผู้เขียน หัวข้อ: control rc servo 2 ตัว ไม่ได้ ใช้ ARM-7 lpc2138  (อ่าน 1959 ครั้ง)
0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้
GUN
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 1


| |
« เมื่อ: มีนาคม 10, 2014, 08:17:42 pm »

ผมติดปัญหาคือว่า มอเตอร์ ทำงานได้แค่ตัวเดียวครับทั้งที่สั่งให้ทำงานสองตัว ผมทราบปัญหาคืออะไรข้อทราบวิธีแก้ด้วยครับ ขอบคุณครับ
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <LPC213x.H>
#include <stdio.h>
int v,v1,val[5],ch=0,x=500,y=500,servo=2,a=0;
float error=0;
float error_o=0;

void delay_ms(long int ms)
{
   long int i,j;
   for(i=0;i<ms;i++)
   for(j=0;j<6555;j++);
}
void uart0_init(unsigned int baudrate)
{
   unsigned short u0dl;
   u0dl = 58982400/(16*baudrate);      // 58982400 --> 19.6608x3 , 4 -->PLL Multiply ,VPBDIV = 1
   PINSEL0 |= 0X00000005;            // set pin is TX0 and RX0
   U0LCR   = 0X83;                    // 10000011 --> SET DLAB = 1 (1)AND SET LENGTH = 8 BIT (11)
   U0DLL   = u0dl & 0XFF;            // DLLSB 8 BIT LOW
   U0DLM   = (u0dl>>8);            // DLMSB 8 BIT HIGH
   U0LCR   = 0X03;                  // SET DLAB = 0
}   
int putchar (int ch)
{
   while(!(U0LSR & 0X20));
   return (U0THR = ch);
}
int getchar (void)
{
   while(!(U0LSR & 0X01));
   return (U0RBR);
}

void read_adc0(void)
{
   PINSEL1 |= 0x15440000;       // P0.25,P0.27,P0.28,29,30 defined as AD 0.0,0.1,0.2,0.3,0.4

//   AD0CR    = 0x00210C01;       // Setup A/D: 10-bit AIN0 @ 4.5MHz ,ch0.2,3
   AD0CR &= 0x00000000;      // Clear All Bit Control
    AD0CR |= 0x00000001;      // Select ADC = AIN0
    AD0CR |= 0x00000A00;      // ADC Clock = VBP(PCLK) / 11
//  AD0CR |= 0x00010000;        // Busrt = 1 = Conversion Continue
    AD0CR &= 0xFFF1FFFF;      // CLKS = 000 = 10Bit : 11 Cycle Clock Conversion
    AD0CR |= 0x00200000;      // PDN = 1 = Active ADC Module
    AD0CR &= 0xF8FFFFFF;      
   AD0CR  |= 0x01000000;       // Start A/D Conversion
    do
   {
      v = AD0DR;
   } while ((v & 0x80000000) == 0);
   val[0] = ((v >> 6) & 0x03FF);


//   AD0CR  = 0x00210C02;       // Setup A/D: 10-bit AIN0 @ 4.5MHz ,ch0.2,3
    AD0CR &= 0x00000000;      // Clear All Bit Control
    AD0CR |= 0x00000002;      // Select ADC = AIN1
    AD0CR |= 0x00000A00;      // ADC Clock = VBP(PCLK) / 11
//  AD0CR |= 0x00010000;          // Busrt = 1 = Conversion Continue
    AD0CR &= 0xFFF1FFFF;      // CLKS = 000 = 10Bit : 11 Cycle Clock Conversion
    AD0CR |= 0x00200000;      // PDN = 1 = Active ADC Module
    AD0CR &= 0xF8FFFFFF;      
   AD0CR  |= 0x01000000;       // Start A/D Conversion
   do
   {
      v = AD0DR;
   } while ((v & 0x80000000) == 0);
   val[1] = ((v >> 6) & 0x03FF);
   

//   AD0CR  = 0x00210C04;       // Setup A/D: 10-bit AIN0 @ 4.5MHz ,ch0.2,3
    AD0CR &= 0x00000000;      // Clear All Bit Control
    AD0CR |= 0x00000004;      // Select ADC = AIN2
    AD0CR |= 0x00000A00;      // ADC Clock = VBP(PCLK) / 11
//  AD0CR |= 0x00010000;        // Busrt = 1 = Conversion Continue
    AD0CR &= 0xFFF1FFFF;      // CLKS = 000 = 10Bit : 11 Cycle Clock Conversion
    AD0CR |= 0x00200000;      // PDN = 1 = Active ADC Module
    AD0CR &= 0xF8FFFFFF;      
   AD0CR  |= 0x01000000;       // Start A/D Conversion
   do
   {
      v = AD0DR;
   } while ((v & 0x80000000) == 0);
   val[2] = ((v >> 6) & 0x03FF);

//   AD0CR  = 0x00210C08;       // Setup A/D: 10-bit AIN0 @ 4.5MHz ,ch0.2,3
    AD0CR &= 0x00000000;      // Clear All Bit Control
    AD0CR |= 0x00000008;      // Select ADC = AIN3
    AD0CR |= 0x00000A00;      // ADC Clock = VBP(PCLK) / 11
//  AD0CR |= 0x00010000;        // Busrt = 1 = Conversion Continue , hardware mode
    AD0CR &= 0xFFF1FFFF;      // CLKS = 000 = 10Bit : 11 Cycle Clock Conversion
    AD0CR |= 0x00200000;      // PDN = 1 = Active ADC Module
    AD0CR &= 0xF8FFFFFF;      
   AD0CR  |= 0x01000000;       // Start A/D Conversion
   do
   {
      v = AD0DR;
   } while ((v & 0x80000000) == 0);
   val[3] = ((v >> 6) & 0x03FF);
   
//   AD0CR  = 0x00210C08;       // Setup A/D: 10-bit AIN0 @ 4.5MHz ,ch0.2,3
    AD0CR &= 0x00000000;      // Clear All Bit Control
    AD0CR |= 0x00000010;      // Select ADC = AIN3
    AD0CR |= 0x00000A00;      // ADC Clock = VBP(PCLK) / 11
//  AD0CR |= 0x00010000;        // Busrt = 1 = Conversion Continue , hardware mode
    AD0CR &= 0xFFF1FFFF;      // CLKS = 000 = 10Bit : 11 Cycle Clock Conversion
    AD0CR |= 0x00200000;      // PDN = 1 = Active ADC Module
   AD0CR &= 0xF8FFFFFF;      
   AD0CR  |= 0x01000000;       // Start A/D Conversion   
   do
   {
      v = AD0DR;
   } while ((v & 0x80000000) == 0);
   val[4] = ((v >> 6) & 0x03FF);//   AD0CR  = 0x00210C08;       // Setup A/D: 10-bit AIN0 @ 4.5MHz ,ch0.2,3
                  
       
}
void init_pwm(void)
{
   PINSEL0 |= 0x00008000;   //Enable pin 0.7   as PWM2
   PINSEL1 |= 0x00000400;   //Enable pin 0.21  as PWM5
   
   PWMPR     = 59;         //Load prescaler 1 usec
   
   PWMPCR = 0x00002500;   //PWM channel 2,5 single edge control, output enabled
   PWMMCR = 0x00000002;   //On match with timer reset the counter
   PWMMR0 = 20000;         //set cycle rate 20ms
   
   PWMMR2 = x;            //set duty of PWM2 to 0.5 ms
   PWMLER = 0x00000004;   //enable shadow latch for match 0 - 2
   
   PWMMR5 = y;            //set duty of PWM5 to 0.5 ms
   PWMLER = 0x00000020;   //enable shadow latch for match 0 - 2
   
   PWMTCR = 0x00000002;   //Reset counter and prescaler
   PWMTCR = 0x00000009;   //enable counter and PWM, release counter from reset
}


void main(void)
{
   

   uart0_init(19200);
          
   
   PINSEL0 |= 0x00008000;   //Enable pin 0.7   as PWM2
   PINSEL1 |= 0x00000400;   //Enable pin 0.21  as PWM5
   
   PWMPR     = 59;      //Load prescaler 1 usec
   
   PWMPCR = 0x00002500;   //PWM channel 2,5 single edge control, output enabled
   PWMMCR = 0x00000002;   //On match with timer reset the counter
   PWMMR0 = 20000;      //set cycle rate 20ms
   
   PWMMR2 = 0;      
   PWMLER = 0x00000004;   //enable shadow latch for match 0 - 2
   
   PWMMR5 = 0;      
   PWMLER = 0x00000020;   //enable shadow latch for match 0 - 2
   
   PWMTCR = 0x00000002;   //Reset counter and prescaler
   PWMTCR = 0x00000009;   //enable counter and PWM, release counter from reset
   
   
   while(1)
   {
   //y=2000;
   //delay_ms(1000);
   PWMMR5 = 2000;
   PWMMR2 = 2000;
   PWMLER |= 0x00000020;
   PWMLER |= 0x00000004;

   /*y=1250;
   delay_ms(1000);
   PWMMR5 = y;
   PWMLER = 0x00000020;
   //x=2000;
   //y=2000;
      
   
   x=1250;
   delay_ms(1000);
   
   PWMLER = 0x00000004;
   

   x=2000;
   delay_ms(1000);
   PWMMR2 = x;
   PWMLER = 0x00000004;*/
      
   
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
ผมติดปัญหาคือว่า มอเตอร์ ทำงานได้แค่ตัวเดียวครับทั้งที่สั่งให้ทำงานสองตัว ผมทราบปัญหาคืออะไรข้อทราบวิธีแก้ด้วยครับ
บันทึกการเข้า
ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

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


ShadowWares


| |
« ตอบ #1 เมื่อ: มีนาคม 12, 2014, 11:03:03 am »

ไม่ได้ดู code นะครับ
รู้ได้อย่างไรว่าคุณได้สั่งมอเตอร์ทั้งสองตัวแล้วจริง code ส่วนไหนเป็นตัวบอก?
ถ้าสั่งแล้วจริงมีสัญญาณออกไปตามที่คุณสั่งหรือยัง ถ้ายังไมีมีตรวจสอบดูให้ดีว่า code ส่วนไหนที่ทำหน้าที่นี้ และมีอะไรผิดพลาดอยู่หรือไม่?
บันทึกการเข้า

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

กระทู้: 3


| |
« ตอบ #2 เมื่อ: กรกฎาคม 05, 2017, 11:47:58 am »

ปัญหาเดียวกับผมเลย
บันทึกการเข้า

หน้า: [1]   ขึ้นบน
  พิมพ์  
 
กระโดดไป: