RSS   



  可打印版本 | 推薦給朋友 | 訂閱主題 | 收藏主題 | 純文字版  


 


 
主題: [C&C++] [問題]C語言問題   字型大小:||| 
h80053
銀驢友〔中級〕
等級: 13等級: 13等級: 13等級: 13


十週年紀念徽章(五級)  

 . 積分: 720
 . 精華: 1
 . 文章: 2053
 . 收花: 5801 支
 . 送花: 8430 支
 . 比例: 1.45
 . 在線: 2473 小時
 . 瀏覽: 17320 頁
 . 註冊: 7176
 . 失蹤: 74
 . 台中
#1 : 2009-1-13 06:51 PM     只看本作者 引言回覆

這一個程式是配合PIC晶片所寫的馬達正反轉兼加減速程式,但是有一個問題就是馬達反轉時無法加減速。其中0-530是反轉(快到慢)531-1024是正轉(慢到快)。
==============================================================
程式如下:
==============================================================
#include<p18f8720.h>
#include<capture.h>
#include<delays.h>
#include<pwm.h>
#include<math.h>
#include <adc.h>
#include <timers.h>void main()
{  
int x,y,i=0,q,b,result,a,v,motor_speed,j=512,k=0,kk=0,speed=0,fc;
int motor[2][16]={
         {480,448,416,384,352,320,288,256,224,192,160,128,96,64,32,0},
         {544,576,608,640,672,704,736,768,800,832,864,896,928,960,992,1024}
        };
     //,i=0
//unsigned OpenADC( ADC_FOSC_32 & ADC_RIGHT_JUST & ADC_5ANA,ADC_CH0 & ADC_INT_OFF &ADC_VREFPLUS_VDD&ADC_VREFMINUS_VSS);  
    OpenTimer2(TIMER_INT_OFF&T2_PS_1_1&T2_POST_1_8);
//===========================================接腳輸出入      
TRISD=0X00;
TRISE=0X00;
PORTE=0X18;
PORTD=0X00;
PORTD=0xFF;
//========================================按鈕開關的設定
   TRISBbits.TRISB0=1;//S1
   TRISBbits.TRISB1=1;//S2
   TRISBbits.TRISB2=1;//S3
   TRISBbits.TRISB3=1;//S4 OpenPWM1(0xff);
//=======================================================馬達設定與PWM頻率
OpenPWM3(0x7f);
OpenPWM5(0xff);
TRISGbits.TRISG0=1;//打開pwm3的功能
TRISGbits.TRISG4=0;//打開pwm5的功能 為馬達
TRISCbits.TRISC2=0;// 打開pwm1的功能
TRISAbits.TRISA5=0;//
PORTAbits.RA5=1;
//==============================================================

while(1)
//===================================馬達正反轉OK

{int i=530,qq=0;
if(PORTBbits.RB0==0&&i>=530&&i<=1000)
{   i=500;
   SetDCPWM5(i);
   Delay10KTCYx(100);   
if(PORTBbits.RB0==0&&i>=20&&i<=500)
    {   i=530;
  SetDCPWM5(i);
  Delay10KTCYx(100);

  }
   
}
====================================//設定馬達加速,但反轉時無法控制
if(PORTBbits.RB1==0&&speed!=15)
{
   speed=speed+1;
  fc=motor[speed]; i為設定正反轉 speed為加減速
TRISGbits.TRISG4=0;
  }   
//===========================================//馬達停止 OK
else if(PORTBbits.RB2==0) //SW3 motor stop
{
OpenPWM5(0xff);
    Delay10KTCYx(100);
PORTAbits.RA5=0;//disable雙極性馬達
TRISGbits.TRISG4=0;
}
//================================================

SetDCPWM5(0x3ff);//可以輸出pwm的工作週期}
}


找不到問題的所在所以貼上來詢問大家地看法,還請指教謝謝。



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
leacks
銀驢友〔高級〕
等級: 14等級: 14等級: 14等級: 14


十週年紀念徽章(六級)  

今日心情

 . 積分: 854
 . 文章: 3455
 . 收花: 6791 支
 . 送花: 4256 支
 . 比例: 0.63
 . 在線: 4840 小時
 . 瀏覽: 30360 頁
 . 註冊: 6844
 . 失蹤: 856
#2 : 2009-1-13 09:01 PM     只看本作者 引言回覆

你是卡到啥陰
你沒講一下



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  訪問主頁  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
h80053
銀驢友〔中級〕
等級: 13等級: 13等級: 13等級: 13


十週年紀念徽章(五級)  

 . 積分: 720
 . 精華: 1
 . 文章: 2053
 . 收花: 5801 支
 . 送花: 8430 支
 . 比例: 1.45
 . 在線: 2473 小時
 . 瀏覽: 17320 頁
 . 註冊: 7176
 . 失蹤: 74
 . 台中
#3 : 2009-1-13 10:38 PM     只看本作者 引言回覆

馬達反轉時無法加減速。
還請大大幫忙謝謝。



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
leacks
銀驢友〔高級〕
等級: 14等級: 14等級: 14等級: 14


十週年紀念徽章(六級)  

今日心情

 . 積分: 854
 . 文章: 3455
 . 收花: 6791 支
 . 送花: 4256 支
 . 比例: 0.63
 . 在線: 4840 小時
 . 瀏覽: 30360 頁
 . 註冊: 6844
 . 失蹤: 856
#4 : 2009-1-13 11:02 PM     只看本作者 引言回覆

寫得真是亂
括弧都亂瓜一通
你要不要好好瓜一次,然後自己重看一次

假設你while那段成立

以下就不知道該怎樣
因為看起來i=530
if(PORTBbits.RB1==0&&speed!=15)
{
   speed=speed+1;
  fc=motor[speed]; i為設定正反轉 speed為加減速
TRISGbits.TRISG4=0;
  }   

//==========
你要不要先測正轉加減速
再測反轉加減速
單一元件測試ok後再合併



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  訪問主頁  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
h80053
銀驢友〔中級〕
等級: 13等級: 13等級: 13等級: 13


十週年紀念徽章(五級)  

 . 積分: 720
 . 精華: 1
 . 文章: 2053
 . 收花: 5801 支
 . 送花: 8430 支
 . 比例: 1.45
 . 在線: 2473 小時
 . 瀏覽: 17320 頁
 . 註冊: 7176
 . 失蹤: 74
 . 台中
#5 : 2009-1-14 08:47 AM     只看本作者 引言回覆

謝謝大大的指教。我馬達正轉加減速是沒有問題的。
如果要反轉加減速的話只要將speed-1就是反轉加
減速。所以二個分開寫是可以個別動作的,但是想
要合併在一起時反轉加減速就不行了。

還請大大指教謝謝。



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
leacks
銀驢友〔高級〕
等級: 14等級: 14等級: 14等級: 14


十週年紀念徽章(六級)  

今日心情

 . 積分: 854
 . 文章: 3455
 . 收花: 6791 支
 . 送花: 4256 支
 . 比例: 0.63
 . 在線: 4840 小時
 . 瀏覽: 30360 頁
 . 註冊: 6844
 . 失蹤: 856
#6 : 2009-1-14 12:32 PM     只看本作者 引言回覆

另外就是
  fc=motor[speed]; i為設定正反轉 speed為加減速
我看起來就怪怪的
而放進VC裡跑果然連組譯都不過

fc=int
motor=2為陣列

fc=motor[i][speed];
該不會你原本要這樣寫吧?
但這樣i又會破表

另外就是fc取得後,沒去用= =

===========
個人套一句老師最常講的,你程式有問題
而我看起來是連架構都有問題



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  訪問主頁  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
leacks
銀驢友〔高級〕
等級: 14等級: 14等級: 14等級: 14


十週年紀念徽章(六級)  

今日心情

 . 積分: 854
 . 文章: 3455
 . 收花: 6791 支
 . 送花: 4256 支
 . 比例: 0.63
 . 在線: 4840 小時
 . 瀏覽: 30360 頁
 . 註冊: 6844
 . 失蹤: 856
#7 : 2009-1-14 12:48 PM     只看本作者 引言回覆

話說要把
關閉 Discuz! 代碼 <<給打勾
得有問題

[leacks 在  2009-2-25 12:37 PM 作了最後編輯]



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  訪問主頁  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
h80053
銀驢友〔中級〕
等級: 13等級: 13等級: 13等級: 13


十週年紀念徽章(五級)  

 . 積分: 720
 . 精華: 1
 . 文章: 2053
 . 收花: 5801 支
 . 送花: 8430 支
 . 比例: 1.45
 . 在線: 2473 小時
 . 瀏覽: 17320 頁
 . 註冊: 7176
 . 失蹤: 74
 . 台中
#8 : 2009-1-14 12:52 PM     只看本作者 引言回覆

fc=motor[speed];
該不會你原本要這樣寫吧?yes

那是我貼程式時可能有把它用掉
fc我有貼回        SetDCPWM5(fc);  
給它動作但是還是有問題
==========================
我的架構可能有問題這我也很清楚
所以希望大大能跟我將哪一部份的
問題跟我說一下
==========================
我也有參考其他同學的可是看到後來會變的
很像就如同抄襲了很多同學的程式後來都跟
一開始交的一樣因為要交報告的關係我還是
希望以自己的想法寫看看
===========================同學程式如下
#include <p18f8720.h>
#include <delays.h>
#include <pwm.h>
#include <math.h>
#include <adc.h>
#include <timers.h>
#include <capture.h>
void main (void)
{
        int i;
        int motor_speed[2][16] = {
                                                          {480,448,416,384,352,320,288,256,224,192,160,128,96,64,32,0},
                                                          {544,576,608,640,672,704,736,768,800,832,864,896,928,960,992,1024}
                                                         };
        int led_array[8] = {0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x00};
        int led_enable[2] = {0xEF,0xFF};
        int led_flag = 0,led_L = 0xFF,led_R = 0xFF;

        int motor_flag = 0,speed = 0,motor = 512 ,stop = 0;                                         
        unsigned int result;

        OpenADC( ADC_FOSC_32 & ADC_RIGHT_JUST & ADC_5ANA,ADC_CH0 & ADC_INT_OFF &ADC_VREFPLUS_VDD&ADC_VREFMINUS_VSS);
        SetChanADC( ADC_CH0 );//手動調速VR
        //PWM相關設定
        OpenTimer2( TIMER_INT_OFF & T2_PS_1_1 & T2_POST_1_8 );
        OpenPWM1(0xff);
        OpenPWM3(0x7f);
        OpenPWM5(0xff);
        TRISD=0X00;
        TRISE=0X00;
        TRISGbits.TRISG0=0;//打開pwm3的功能
        TRISGbits.TRISG4=0;//打開pwm5的功能
        TRISCbits.TRISC2=0;// 打開pwm1的功能
        TRISAbits.TRISA5=0;//
        PORTAbits.RA5=1;

        SetDCPWM3(0);

        while(1)
        {
                if(PORTBbits.RB0==0)
                {   
                        if(motor_flag == 0)
                        {
                                motor_flag = 1;
                        }
                        else if(motor_flag == 1)
                        {
                                motor_flag = 0;
                        }
                        SetDCPWM3(250);
                        Delay10KTCYx(100);
                        SetDCPWM3(0);
                }
                else if((PORTBbits.RB1==0) && (speed!=15))
                {
                        speed = speed + 1;
                        SetDCPWM3(250);
                        Delay10KTCYx(100);
                        SetDCPWM3(0);
                }
                else if((PORTBbits.RB2==0) && (speed!=0))
                {       
                        speed = speed - 1;
                        SetDCPWM3(250);
                        Delay10KTCYx(100);
                        SetDCPWM3(0);
                }
                else if(PORTBbits.RB3==0)
                {
                        if(stop == 0)
                        {
                                stop = 1;
                        }
                        else if(stop == 1)
                        {
                                stop = 0;
                        }
                        SetDCPWM3(250);
                        Delay10KTCYx(100);
                        SetDCPWM3(0);
                }


                if(stop == 1)
                {
                        motor = 512;
                }
                else
                {
                        motor = motor_speed[motor_flag][speed];
                }
                SetDCPWM5(motor);


                switch(speed)
                {
                        case 0:
                                led_L = led_array[0];
                                led_R =        0xFF;
                        break;

                        case 1:
                                led_L = led_array[1];
                                led_R =        0xFF;
                        break;

                        case 2:
                                led_L = led_array[2];
                                led_R =        0xFF;
                        break;

                        case 3:
                                led_L = led_array[3];
                                led_R =        0xFF;
                        break;

                        case 4:
                                led_L = led_array[4];
                                led_R =        0xFF;
                        break;

                        case 5:
                                led_L = led_array[5];
                                led_R =        0xFF;
                        break;

                        case 6:
                                led_L = led_array[6];
                                led_R =        0xFF;
                        break;

                        case 7:
                                led_L = led_array[7];
                                led_R =        0xFF;
                        break;

                        case 8:
                                led_L = led_array[7];
                                led_R =        led_array[0];
                        break;

                        case 9:
                                led_L = led_array[7];
                                led_R =        led_array[1];
                        break;

                        case 10:
                                led_L = led_array[7];
                                led_R =        led_array[2];
                        break;

                        case 11:
                                led_L = led_array[7];
                                led_R =        led_array[3];
                        break;

                        case 12:
                                led_L = led_array[7];
                                led_R =        led_array[4];
                        break;

                        case 13:
                                led_L = led_array[7];
                                led_R =        led_array[5];
                        break;

                        case 14:
                                led_L = led_array[7];
                                led_R =        led_array[6];
                        break;

                        case 15:
                                led_L = led_array[7];
                                led_R =        led_array[7];
                        break;
                }


                if(led_flag == 0)
                {
                        led_flag = 1;
                //        PORTE = led_enable[led_flag];
                        PORTEbits.RE3=0;
                        PORTD = led_R;
                        PORTEbits.RE4=1;
                }
                else if(led_flag == 1)
                {
                        led_flag = 0;
                //        PORTE = led_enable[led_flag];
                        PORTEbits.RE3=1;
                        PORTEbits.RE4=0;
                        PORTD = led_L;
                }

                if(speed == 15)
                {
                        SetDCPWM3(850);
                }
                else
                {
                        SetDCPWM3(0);
                }
        }
        SetDCPWM5(0x3ff);//可以輸出pwm的工作週期
        SetDCPWM1(0x3ff);//可以輸出pwm的工作週期
}



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記

   

快速回覆
表情符號

更多 Smilies

字型大小 : |||      [完成後可按 Ctrl+Enter 發佈]        

溫馨提示:本區開放遊客瀏覽。
選項:
關閉 URL 識別    關閉 表情符號    關閉 Discuz! 代碼    使用個人簽名    接收新回覆信件通知
發表時自動複製內容   [立即複製] (IE only)


 



所在時區為 GMT+8, 現在時間是 2024-3-28 05:15 PM
清除 Cookies - 連絡我們 - TWed2k © 2001-2046 - 純文字版 - 說明
Discuz! 0.1 | Processed in 0.028308 second(s), 7 queries , Qzip disabled