Welcome & Happy Holidays!
Kết quả 1 đến 3 của 3
  1. #1
    Ngày tham gia
    Sep 2015
    Đang ở
    Hà Nội
    Bài viết
    0

    Help: điều khiển xung dựa vào cảm biến siêu âm SRF05

    em có đoạn code viết theo dựa vào giao tiếp của SRF05 với pic16f877a nhưng em không thể điều khiển được xung mong mọi người giúp em với ah. có câu lệnh khi em chưa viết vào thi xung vẫn điều khiển được nhưng khi thêm vào lại pwm lại bị thay đổi ("range=SRF05_GetDistance()") mong mọi người giúp em với ah.
    cả code của em như thế này ah:
    #include <def_16f877a.h>
    #FUSES NOWDT,HS,NOPUT,NOPROTECT,NODEBUG,NOBROWNOUT,NOLVP, NOCPD,RESERVED
    #device *=16 adc=8
    #use delay(clock=200000000)
    #define SRF05_TRIGGER1 PIN_B1
    #define SRF05_TRIGGER2 PIN_B2
    #define SRF05_TRIGGER3 PIN_B3
    #define SRF05_ECHO PIN_B0
    #define NO_OBJECT 0
    unsigned int32 num_pulse=0;
    int1 range_ok=0;
    unsigned int ldr;
    #INT_EXT // ngat ngoai
    void Ngat_Ngoai(void)
    {
    disable_interrupts(GLOBAL);
    num_pulse+=get_timer1();
    range_ok=1;
    enable_interrupts(GLOBAL);
    }
    #INT_TIMER1 // ngat timer 1
    void Ngat_Timer1(void)
    {
    disable_interrupts(GLOBAL);
    num_pulse+=0xffff;
    enable_interrupts(GLOBAL);
    }
    void SRF05_StartRange() // tao xung kich trigger
    {
    while(!range_ok)
    {
    output_high(SRF05_TRIGGER1);
    delay_ms(15); // Phai tao 1 xung len co do lon it nhat 10ms
    output_low(SRF05_TRIGGER1); // Bat dau phep do.
    while(!(input(SRF05_ECHO))); // Doi cho den khi chan ECHO duoc keo len cao
    set_timer1(0);
    enable_interrupts(GLOBAL);
    delay_ms(50);
    }
    }
    float32 SRF05_GetDistance() // ham lay khoang cach
    {
    float32 time_us=0,distance=0;
    SRF05_StartRange();
    disable_interrupts(GLOBAL);
    if(num_pulse>180000)
    {
    num_pulse=0;
    range_ok=0;
    return NO_OBJECT;
    }
    else
    {
    time_us=num_pulse/5;
    distance=time_us/58;
    num_pulse=0;
    range_ok=0;
    return distance;
    }
    }
    void adc()// adc
    {
    setup_adc_ports(AN0);
    set_adc_channel(0);
    }
    void main()
    {
    float32 range;
    output_float(SRF05_ECHO); // tao xung echo ho
    output_drive(SRF05_TRIGGER1);
    output_drive(SRF05_TRIGGER2);
    output_drive(SRF05_TRIGGER3);
    port_b_pullups(TRUE);
    ext_int_edge(H_TO_L);// ngat canh xuong
    setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);//
    enable_interrupts(INT_TIMER1); // kich hoat ngat timer 1
    enable_interrupts(INT_EXT); // kich hoat ngat ngoai timer 1
    disable_interrupts(GLOBAL);
    set_tris_c(0B00000000);
    set_tris_b(0x00);
    setup_timer_2(T2_DIV_BY_16,63,1);
    setup_ccp1(CCP_PWM);
    setup_adc(adc_clock_internal);
    setup_adc_ports(AN0);
    while(1)
    {

    ldr=read_adc();
    if(ldr>134){
    set_pwm1_duty(0); // cho chan xung ra muc 0
    }
    else{
    set_pwm1_duty(64); cho chan pwm1 ra muc 1
    delay_ms(500);
    range=SRF05_GetDistance(); // gan ket qua do tu cam bien srf05
    if (range==NO_OBJECT) // khong co vat can
    {
    set_pwm1_duty(46); // thi dieu che 70 %
    delay_ms(500);
    }
    else{
    set_pwm1_duty(60);// neu co vat can thi dieu che 90 %
    delay_ms(500);
    }
    }
    }
    }

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    không có ai giúp em với ah

  3. #3
    Ngày tham gia
    Sep 2015
    Đang ở
    http://dongagroup.vn/
    Bài viết
    0
    Trích dẫn Gửi bởi tungk1
    em có đoạn code viết theo dựa vào giao tiếp của SRF05 với pic16f877a nhưng em không thể điều khiển được xung mong mọi người giúp em với ah. có câu lệnh khi em chưa viết vào thi xung vẫn điều khiển được nhưng khi thêm vào lại pwm lại bị thay đổi ("range=SRF05_GetDistance()") mong mọi người giúp em với ah.
    cả code của em như thế này ah:
    #include <def_16f877a.h>
    #FUSES NOWDT,HS,NOPUT,NOPROTECT,NODEBUG,NOBROWNOUT,NOLVP, NOCPD,RESERVED
    #device *=16 adc=8
    #use delay(clock=200000000)
    #define SRF05_TRIGGER1 PIN_B1
    #define SRF05_TRIGGER2 PIN_B2
    #define SRF05_TRIGGER3 PIN_B3
    #define SRF05_ECHO PIN_B0
    #define NO_OBJECT 0
    unsigned int32 num_pulse=0;
    int1 range_ok=0;
    unsigned int ldr;
    #INT_EXT // ngat ngoai
    void Ngat_Ngoai(void)
    {
    disable_interrupts(GLOBAL);
    num_pulse+=get_timer1();
    range_ok=1;
    enable_interrupts(GLOBAL);
    }
    #INT_TIMER1 // ngat timer 1
    void Ngat_Timer1(void)
    {
    disable_interrupts(GLOBAL);
    num_pulse+=0xffff;
    enable_interrupts(GLOBAL);
    }
    void SRF05_StartRange() // tao xung kich trigger
    {
    while(!range_ok)
    {
    output_high(SRF05_TRIGGER1);
    delay_ms(15); // Phai tao 1 xung len co do lon it nhat 10ms
    output_low(SRF05_TRIGGER1); // Bat dau phep do.
    while(!(input(SRF05_ECHO))); // Doi cho den khi chan ECHO duoc keo len cao
    set_timer1(0);
    enable_interrupts(GLOBAL);
    delay_ms(50);
    }
    }
    float32 SRF05_GetDistance() // ham lay khoang cach
    {
    float32 time_us=0,distance=0;
    SRF05_StartRange();
    disable_interrupts(GLOBAL);
    if(num_pulse>180000)
    {
    num_pulse=0;
    range_ok=0;
    return NO_OBJECT;
    }
    else
    {
    time_us=num_pulse/5;
    distance=time_us/58;
    num_pulse=0;
    range_ok=0;
    return distance;
    }
    }
    void adc()// adc
    {
    setup_adc_ports(AN0);
    set_adc_channel(0);
    }
    void main()
    {
    float32 range;
    output_float(SRF05_ECHO); // tao xung echo ho
    output_drive(SRF05_TRIGGER1);
    output_drive(SRF05_TRIGGER2);
    output_drive(SRF05_TRIGGER3);
    port_b_pullups(TRUE);
    ext_int_edge(H_TO_L);// ngat canh xuong
    setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);//
    enable_interrupts(INT_TIMER1); // kich hoat ngat timer 1
    enable_interrupts(INT_EXT); // kich hoat ngat ngoai timer 1
    disable_interrupts(GLOBAL);
    set_tris_c(0B00000000);
    set_tris_b(0x00);
    setup_timer_2(T2_DIV_BY_16,63,1);
    setup_ccp1(CCP_PWM);
    setup_adc(adc_clock_internal);
    setup_adc_ports(AN0);
    while(1)
    {

    ldr=read_adc();
    if(ldr>134){
    set_pwm1_duty(0); // cho chan xung ra muc 0
    }
    else{
    set_pwm1_duty(64); cho chan pwm1 ra muc 1
    delay_ms(500);
    range=SRF05_GetDistance(); // gan ket qua do tu cam bien srf05
    if (range==NO_OBJECT) // khong co vat can
    {
    set_pwm1_duty(46); // thi dieu che 70 %
    delay_ms(500);
    }
    else{
    set_pwm1_duty(60);// neu co vat can thi dieu che 90 %
    delay_ms(500);
    }
    }
    }
    }
    rang_ok để làm gì vậy bạn

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •  
Múi giờ GMT +7. Bây giờ là 04:50 PM. Diễn đàn sử dụng vBulletin® Phiên bản 4.2.5.
Bản quyền của 2024 vBulletin Solutions, Inc. Tất cả quyền được bảo lưu.
Ban quản trị không chịu trách nhiệm về nội dung do thành viên đăng.