1,042
社区成员
发帖
与我相关
我的任务
分享这是我参加朝闻道知识分享大赛的第2篇文章
注:该内容为本人原创,其中配置环境的操作和代码也为本人网上自行学习总结,并非属于任何一个实验室或者集体!!!
注:该内容为本人原创,其中配置环境的操作和代码也为本人网上自行学习总结,并非属于任何一个实验室或者集体!!!
注:该内容为本人原创,其中配置环境的操作和代码也为本人网上自行学习总结,并非属于任何一个实验室或者集体!!!
目录
(2)UART_INDEX 的接收中断处理函数 这个函数将在 UART_INDEX 对应的中断调用
1、vofa的介绍与代码配置,请参考第一篇文章 http://t.csdnimg.cn/GicvJ
2、vofa串口助手配置,请参考第二篇文章 http://t.csdnimg.cn/hiGrZ
3、vofa串口助手操作说明,请参考本篇文章 http://t.csdnimg.cn/2NOd9
经典控制理论中的PID控制分为位置式和增量式,可分别设置调参。
uint8 uart_get_data[64]; // 串口接收数据缓冲区
uint8 fifo_get_data[64]; // fifo 输出读出缓冲区
uint8 get_data = 0; // 接收数据变量
uint32 fifo_data_count = 0; // fifo 数据个数
fifo_struct uart_data_fifo;
void Init_uart(void)
{
fifo_init(&uart_data_fifo, FIFO_DATA_8BIT, uart_get_data, 64); // 初始化 fifo 挂载缓冲区
uart_init(UART_INDEX, UART_BAUDRATE, UART_TX_PIN, UART_RX_PIN); // 初始化串口
uart_rx_interrupt(UART_INDEX, 1); // 开启 UART_INDEX 的接收中断
uart_write_string(UART_INDEX, "UART Text."); // 输出测试信息
uart_write_byte(UART_INDEX, '\r'); // 输出回车
uart_write_byte(UART_INDEX, '\n');
}
void Send_test(void)
{
fifo_data_count = fifo_used(&uart_data_fifo); // 查看 fifo 是否有数据
if(fifo_data_count != 0) // 读取到数据了
{
fifo_read_buffer(&uart_data_fifo, fifo_get_data, &fifo_data_count, FIFO_READ_AND_CLEAN); // 将 fifo 中数据读出并清空 fifo 挂载的缓冲
uart_write_string(UART_INDEX, "\r\nUART get data:"); // 输出测试信息
uart_write_buffer(UART_INDEX, fifo_get_data, fifo_data_count); // 将读取到的数据发送出去
}
system_delay_ms(10);
}
// 参数说明 void
// 返回参数 void
// 使用示例 uart_rx_interrupt_handler();
void uart_rx_interrupt_handler (void)
{
// get_data = uart_read_byte(UART_INDEX); // 接收数据 while 等待式 不建议在中断使用
uart_query_byte(UART_INDEX, &get_data); // 接收数据 查询式 有数据会返回 TRUE 没有数据会返回 FALSE
fifo_write_buffer(&uart_data_fifo, &get_data, 1);// 将数据写入 fifo 中
}
// 参数说明 void
// 返回参数 void
// 使用示例 data=Get_Data();
float Get_Data(void)
{
uint8_t data_Start_Num = 0; // 记录数据位开始的地方
uint8_t data_End_Num = 0; // 记录数据位结束的地方
uint8_t data_Num = 0; // 记录数据位数
uint8_t minus_Flag = 0; // 判断是不是负数
float data_return = 0; // 解析得到的数据
for(uint8_t i=0;i<64;i++) // 查找等号和感叹号的位置
{
if(fifo_get_data[i] == '=') data_Start_Num = i + 1; // +1是直接定位到数据起始位
if(fifo_get_data[i] == '!')
{
data_End_Num = i - 1;
break;
}
}
if(fifo_get_data[data_Start_Num] == '-') // 如果是负数
{
data_Start_Num += 1; // 后移一位到数据位
minus_Flag = 1; // 负数flag
}
data_Num = data_End_Num - data_Start_Num + 1;
if(data_Num == 4) // 数据共4位
{
data_return = (fifo_get_data[data_Start_Num]-48) + (fifo_get_data[data_Start_Num+2]-48)*0.1f +
(fifo_get_data[data_Start_Num+3]-48)*0.01f;
}
else if(data_Num == 5) // 数据共5位
{
data_return = (fifo_get_data[data_Start_Num]-48)*10 + (fifo_get_data[data_Start_Num+1]-48) + (fifo_get_data[data_Start_Num+3]-48)*0.1f +
(fifo_get_data[data_Start_Num+4]-48)*0.01f;
}
else if(data_Num == 6) // 数据共6位
{
data_return = (fifo_get_data[data_Start_Num]-48)*100 + (fifo_get_data[data_Start_Num+1]-48)*10 + (fifo_get_data[data_Start_Num+2]-48) +
(fifo_get_data[data_Start_Num+4]-48)*0.1f + (fifo_get_data[data_Start_Num+5]-48)*0.01f;
}
if(minus_Flag == 1) data_return = -data_return;
// printf("data=%.2f\r\n",data_return);
return data_return;
}
// 参数说明 void
// 返回参数 void
// 使用示例 USART_PID_Adjust(1)(以左电机为例)
void USART_PID_Adjust(uint8_t Motor_n)
{
float data_Get = Get_Data(); // 存放接收到的数据
// printf("data=%.2f\r\n",data_Get);
if(Motor_n == 1)//左边电机
{
if(fifo_get_data[0]=='P' && fifo_get_data[1]=='2') // 速度环P
speedP = data_Get;
else if(fifo_get_data[0]=='I' && fifo_get_data[1]=='2') // 速度环I
speedI = data_Get*0.01;
else if(fifo_get_data[0]=='D' && fifo_get_data[1]=='2') // 速度环D
speedD = data_Get;
else if(fifo_get_data[0]=='S' && fifo_get_data[1]=='2') //目标速度
expSpeedL = data_Get*10;
}
}
void Init_uart(void);
void Send_test(void);
void uart_rx_interrupt_handler (void);
float Get_Data(void);
void USART_PID_Adjust(uint8_t Motor_n);
extern uint8 uart_get_data[64]; // 串口接收数据缓冲区
extern uint8 fifo_get_data[64]; // fifo 输出读出缓冲区
extern uint8 get_data; // 接收数据变量
extern uint32 fifo_data_count; // fifo 数据个数
extern fifo_struct uart_data_fifo;
#define UART_INDEX (DEBUG_UART_INDEX ) // 默认 UART_0
#define UART_BAUDRATE (DEBUG_UART_BAUDRATE) // 默认 115200
#define UART_TX_PIN (DEBUG_UART_TX_PIN ) // 默认 UART0_TX_P14_0
#define UART_RX_PIN (DEBUG_UART_RX_PIN )
该篇文章PID代码配置内容较多,请认真观看代码含义,下一篇内容将详细介绍串口助手操作部分