基于RT1064的電磁巡線小車
文章目錄
- 使用步驟
- 1.初始化引數
- 2.中斷函式
- 3.代碼整體
- 總結
本文章是基于RT1064讓智能小車實作電磁巡線,
提示:以下是本篇文章正文內容,下面案例可供參考
使用步驟
1.初始化引數
代碼如下(示例):
DisableGlobalIRQ();
board_init();
//電機初始化
//右輪轉動方向設定
gpio_init(D12, GPO, 0, GPIO_PIN_CONFIG);
gpio_init(D13, GPO, 0, GPIO_PIN_CONFIG);
//左輪轉動方向設定
gpio_init(D14, GPO, 0, GPIO_PIN_CONFIG);
gpio_init(D15, GPO, 0, GPIO_PIN_CONFIG);
//初始化電機PWN
pwm_init(PWM1_MODULE3_CHB_D1, 1000, 10000);
pwm_init(PWM1_MODULE3_CHA_D0, 1000, 10000);
//舵機初始化
pwm_init(PWM4_MODULE2_CHA_C30, 50, 800);
//初始化ADC模塊
adc_init(ADC_1,ADC1_CH4_B15,ADC_8BIT);
adc_init(ADC_1,ADC1_CH3_B14,ADC_8BIT);
//中斷初始化
pit_init();
pit_interrupt_ms(PIT_CH1, 10);
EnableGlobalIRQ(0);
2.中斷函式
代碼如下(示例):
//AD采集
for(int i=0;i<10;i++)
{
adcnumber_right_value[i]=adc_convert(ADC_1,ADC1_CH4_B15);
adcnumber_left_value[i]=adc_convert(ADC_1,ADC1_CH3_B14);
}
adcnumber_right=(adcnumber_right_value[4]+adcnumber_right_value[5])/2;
adcnumber_left=(adcnumber_left_value[4]+adcnumber_left_value[5])/2;
//越界判斷
if(adcnumber_right>10&&adcnumber_left>10)
{
gpio_set(D12, 0);
gpio_set(D13, 1);
gpio_set(D14, 0);
gpio_set(D15, 1);
}
else
{
gpio_set(D12, 0);
gpio_set(D13, 0);
gpio_set(D14, 0);
gpio_set(D15, 0);
}
//PID資料處理
PIDRegulation(&pid_value, adcnumber_left-adcnumber_right)
//舵機控制
pwn_serve=800+pid_value.result;
3.代碼整體
main.c檔案
#include "headfile.h"
uint32 pwn_serve_init = 800;
main(void)
{
DisableGlobalIRQ();
board_init();
//電機初始化
//右輪設定
gpio_init(D12, GPO, 0, GPIO_PIN_CONFIG);
gpio_init(D13, GPO, 0, GPIO_PIN_CONFIG);
//左輪設定
gpio_init(D14, GPO, 0, GPIO_PIN_CONFIG);
gpio_init(D15, GPO, 0, GPIO_PIN_CONFIG);
pwm_init(PWM1_MODULE3_CHB_D1, 1000, 10000);
pwm_init(PWM1_MODULE3_CHA_D0, 1000, 10000);
//舵機初始化
pwm_init(PWM4_MODULE2_CHA_C30, 50, 800);
//初始化ADC模塊
adc_init(ADC_1,ADC1_CH4_B15,ADC_8BIT);
adc_init(ADC_1,ADC1_CH3_B14,ADC_8BIT);
//中斷初始化
pit_init();
pit_interrupt_ms(PIT_CH1, 10);
EnableGlobalIRQ(0);
while (1)
{
//pwm_duty(PWM4_MODULE2_CHA_C30, pwn_serve_init);
}
}
isr.c檔案
#include "headfile.h"
#include "isr.h"
typedef struct
typedef struct
{
int KP;//比例系數
int KI;//積分系數
int KD;//微分系數
int lasterror_1;//前一拍偏差
int lasterror_2;//前兩拍偏差
int result;//輸出值
}PID;
//初始化pid引數
PID pid_value={3,0,30,0,0,0};
//ADC采集
int adcnumber_right_value[10]={0};
int adcnumber_left_value[10]={0};
int pwn_serve=800;
//PID演算法
void PIDRegulation(PID *vPID, int thiserror)
{
vPID->result = vPID->KP * ( thiserror - vPID->lasterror_1 ) + vPID->KI * thiserror + vPID->KD * ( thiserror - 2 * vPID->lasterror_1 + vPID->lasterror_2 );
vPID->lasterror_2 = vPID->lasterror_1;
vPID->lasterror_1 = thiserror;
}
void CSI_IRQHandler(void)
{
CSI_DriverIRQHandler(); //呼叫SDK自帶的中斷函式 這個函式最后會呼叫我們設定的回呼函式
__DSB(); //資料同步隔離
}
void PIT_IRQHandler(void)
{
if(PIT_FLAG_GET(PIT_CH0))
{
PIT_FLAG_CLEAR(PIT_CH0);
}
if(PIT_FLAG_GET(PIT_CH1))
{
int adcnumber_right=0;
int adcnumber_left=0;
//AD采集
for(int i=0;i<10;i++)
{
adcnumber_right_value[i]=adc_convert(ADC_1,ADC1_CH4_B15);
adcnumber_left_value[i]=adc_convert(ADC_1,ADC1_CH3_B14);
}
adcnumber_right=(adcnumber_right_value[4]+adcnumber_right_value[5])/2;
adcnumber_left=(adcnumber_left_value[4]+adcnumber_left_value[5])/2;
//越界判斷
if(adcnumber_right>10&&adcnumber_left>10)
{
gpio_set(D12, 0);
gpio_set(D13, 1);
gpio_set(D14, 0);
gpio_set(D15, 1);
}
else
{
gpio_set(D12, 0);
gpio_set(D13, 0);
gpio_set(D14, 0);
gpio_set(D15, 0);
}
//PID資料處理
PIDRegulation(&pid_value, adcnumber_left-adcnumber_right);
//舵機控制
pwn_serve=800+pid_value.result;//800為舵機中值
pwm_duty(PWM4_MODULE2_CHA_C30,pwn_serve);
PIT_FLAG_CLEAR(PIT_CH1);//清除中斷標記位
}
if(PIT_FLAG_GET(PIT_CH2))
{
PIT_FLAG_CLEAR(PIT_CH2);
}
if(PIT_FLAG_GET(PIT_CH3))
{
PIT_FLAG_CLEAR(PIT_CH3);
}
__DSB();
}
void GPIO2_Combined_16_31_IRQHandler(void)
{
if(GET_GPIO_FLAG(B15))
{
CLEAR_GPIO_FLAG(B15);//清除中斷標志位
}
}
void GPIO2_Combined_0_15_IRQHandler(void)
{
if(GET_GPIO_FLAG(MT9V03X_VSYNC_PIN))
{
//不用清除標志位,標志位在mt9v03x_vsync函式內部會清除
if(1 == flexio_camera_type)mt9v03x_vsync();
}
if(GET_GPIO_FLAG(SCC8660_VSYNC_PIN))
{
//不用清除標志位,標志位在scc8660_vsync函式內部會清除
if(2 == flexio_camera_type)scc8660_vsync();
}
}
總結
注意事項(1)本文章的使用了tb6612電機驅動芯片對電機進行驅動,
(2)各個函式的操作都可以在相應的庫里的.c檔案和.h檔案里查找,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/195702.html
標籤:其他
