-
其他版本的逐飞逐手或芯片,佬们可根据此文章旋转起你们的大脑
建议先看完其内说明书,了解基本页面。
其中有例程,有应用,也有说明书(只能说他在要应用上是一部 ( 史 ) 诗);
一、为什么要使用逐飞软件示波器
我开始使用它,是因为我参加智能车竞赛,想在软件上更简便的能调PID,观察波形变化寻找最优方案。
我在写此文之前,也粗浅的了解了MATLAB的simulink仿真,也只学了两天,所以只搭了一个简单的PID单环。也经过学长建议,还是要搞逐飞助手。毕竟仿真不能准确的反应现实,但能预测,并且能减少出错率或试错数,减少消耗精力与时间。
为啥选逐飞助手,明明更新换代的这么快?
因为我车用的逐飞开源底层代码库,哈哈哈额,哈哈,额。
二、了解基本函数与变量的基本作用
1.seekfree_assistant_init()与
fifo_init(&temp_uart_fifo, FIFO_DATA_8BIT, temp_uart_buffer, TEMP_BUFFER_SIZE);
这个基本上不用说,用于初始化逐飞助手,初始化fifo,即数据缓冲器,启用存储。
函数简介 FIFO 初始化 挂载对应缓冲区
参数说明 *fifo FIFO 对象指针
参数说明 type FIFO 数据位数
参数说明 *buffer_addr 要挂载的缓冲区
参数说明 size 缓冲区大小
返回参数 fifo_state_enum 操作状态
2.seekfree_assistant_oscilloscope_struct结构体
(seekfree_assistant_parameter_struct同下类似)
包含了示波器的各项参数:
-
head帧头:帧头在结构体中主要用于数据的定界和同步,确保数据正确传输和处理。详细作用不多讲了。
-
channel_num(高四位为功能字 低四位为通道数量):执行特定的操作指令或设置测量参数。设置表明使用通道数。
-
check_sum和校检:用于确保数据的准确性和完整性。
-
length包长度:确定波形数据的存储时间和显示范围。
-
dat[SEEKFREE_ASSISTANT_SET_OSCILLOSCOPE_COUNT]通道数据:用于存储各通道数据,可用于发送到示波器。
//seekfree_assistant_parameter_struct基本成员功能也同上。
3.(*seekfree_assistant_transfer)(const uint8 *buff, uint32 length)
发送回掉函数,用于从中发送数据,传输存储的函数。
参数说明 *buff 需要发送的数据地址
参数说明 length 需要发送的长度
返回参数 uint32 剩余未发送数据长度
4.(*seekfree_assistant_receive) (uint8 *buff, uint32 length)
接收回掉函数,用于接收数据,从接收回调中读取数据,可用于接收在逐飞助手上改变的值。
参数说明 *buff 需要接收的数据地址
参数说明 length 要接收的数据最大长度
返回参数 uint32 接收到的数据长度
5.uart_isr_call_back(uint8 dat)
该函数在isr.c的UART1_Isr() 中断服务函数中进行回调。
将读取到的数据写入FIFO中,进行存储。
6.seekfree_assistant_data_analysis(void)
对接收的数据进行分析,其中包括,读取数据,写入fifo,找帧头,筛选等操作。
7.seekfree_assistant_oscilloscope_send(seekfree_assistant_oscilloscope_struct *seekfree_assistant_oscilloscope);
发送数据到示波器上,进行显示的函数。
参数为要发送的seekfree_assistant_oscilloscope_struct结构体成员dat数组。
8.seekfree_assistant_parameter_update_flag[];
当某一通道接收到数据时其对应下标的flag会开通。
9.seekfree_assistant_parameter[];
存储了对应下标通道的改变后的值,在seekfree_assistant_data_analysis(void)使用了。
-
到这里基本的东西已经讲完(其实是能力有限,嘿嘿),接下来是发送接收要用什么了。
三、示波器调参的代码部分
要接收和发送,可根据实例进行结合。
step1:
三个回调函数要先立在主函数外。这样才能对fifo存储内容进行操作。
#define TEMP_BUFFER_SIZE 64
static fifo_struct temp_uart_fifo;
static uint8 temp_uart_buffer[TEMP_BUFFER_SIZE]; // 数据存放数组
uint8 i;
float b;
uint32 seekfree_assistant_receive_callback (const uint8 *buff, uint32 length)
{
fifo_read_buffer(&temp_uart_fifo, buff, &length, FIFO_READ_AND_CLEAN);
return length;
}
uint8 i = 0;
uint32 seekfree_assistant_transfer_callback (const uint8 *buff, uint32 length)
{
uart_putbuff(DEBUG_UART, buff, length);
return 0;
}
// 该函数在isr.c的UART1_Isr() 中断服务函数中进行回调。
void uart_isr_call_back(uint8 dat)
{
fifo_write_buffer(&temp_uart_fifo, &dat, 1);
}
千万记住要在UART1_Isr() 中断服务函数中进行回调。
step2:
在主函数循环外进行函数指针设置与各种初始化。
// 设置函数指针
seekfree_assistant_transfer = seekfree_assistant_transfer_callback;
// 设置函数指针
seekfree_assistant_receive = seekfree_assistant_receive_callback;
seekfree_assistant_init();
// 创建fifo
fifo_init(&temp_uart_fifo, FIFO_DATA_8BIT, temp_uart_buffer, TEMP_BUFFER_SIZE);
step3:
在主函数循环中的代码实例:
//分析接收数据
seekfree_assistant_data_analysis();
//遍历寻找改变了值的通道,SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT可替换成你所设的通道数
for(i = 0; i < SEEKFREE_ASSISTANT_SET_PARAMETR_COUNT; i++)
{
if(seekfree_assistant_parameter_update_flag[i])
{
//标志清0
seekfree_assistant_parameter_update_flag[i] = 0;
//接收赋值
b = seekfree_assistant_parameter[i];
seekfree_assistant_oscilloscope_data[i] = b;
}
}
// 通过串口发送虚拟示波器数据
seekfree_assistant_oscilloscope_send(&seekfree_assistant_oscilloscope_data);
具体的其它功能实现,大家加油。
总结:为啥不这些代码写一起发出来,因为我要水篇幅(bushi
因为分开写好讲解,并且也不会让人望而却步,基本安步骤来操作应该没啥问题吧、吧,吧?
本人现为大一学生,且是第一次发文,菜基一个。看没人讲这个,我也因此饱受折磨,才作此文。
希望各位佬能指出错误,我也能多学点东西。