mirror of
https://github.com/NanjingForestryUniversity/valveboard.git
synced 2025-11-09 06:44:07 +00:00
每路阀添加单独的开启超时机制
改动了固件
This commit is contained in:
parent
054f1e9495
commit
6af8dfd09c
@ -35,5 +35,5 @@ b分支编号-h硬件版本-p协议版本-f固件版本
|
|||||||
|
|
||||||
## 作者
|
## 作者
|
||||||
|
|
||||||
**丁坤,2019年9月入学、丁坤QQ1091546069、丁坤电话17761700156**,他觉得老阀板工程很乱,重新开发了关于阀板的一切,并放到这个仓库里,计划以后就在这个仓库里迭代更新,无论有没有毕业,都很乐意解答关于阀板的所有问题
|
**丁坤,2019年9月入学、丁坤QQ1091546069、丁坤电话17761700156**,他觉得老阀板工程很乱,重新开发了关于阀板的一切,并放到这个仓库里,计划以后就在这个仓库里迭代更新,作者已经毕业,但很乐意解答关于阀板的所有问题
|
||||||
|
|
||||||
|
|||||||
@ -18,5 +18,5 @@
|
|||||||
|
|
||||||
## 作者
|
## 作者
|
||||||
|
|
||||||
**丁坤,2019年9月入学、丁坤QQ1091546069、丁坤电话17761700156**,无论有没有毕业,都很乐意解答关于这份协议的所有问题
|
**丁坤,2019年9月入学、丁坤QQ1091546069、丁坤电话17761700156**,作者已经毕业,但很乐意解答有关的所有问题
|
||||||
|
|
||||||
|
|||||||
@ -12,7 +12,7 @@ Quartus软件
|
|||||||
|
|
||||||
## Changelog
|
## Changelog
|
||||||
|
|
||||||
**作者是丁坤,2019年9月入学、丁坤QQ1091546069、丁坤电话17761700156**,他是搞嵌入式的,自师兄王聪(2018年9月入学)毕业后硬件领域师门出现空档期,被老倪催的没办法了,就学了硬件并顺手写了这份FPGA代码,无论有没有毕业,作者都很乐意解答关于固件的所有问题
|
**作者是丁坤,2019年9月入学、丁坤QQ1091546069、丁坤电话17761700156**,他是搞嵌入式的,自师兄王聪(2018年9月入学)毕业后硬件领域师门出现空档期,被老倪催的没办法了,就顺手写了这份FPGA代码,作者已经毕业,但很乐意解答关于固件的所有问题
|
||||||
|
|
||||||
### v1.0
|
### v1.0
|
||||||
|
|
||||||
@ -31,3 +31,7 @@ Quartus软件
|
|||||||
- 添加了高电压抑制,见[issue#4](https://github.com/NanjingForestryUniversity/valveboard/issues/4)
|
- 添加了高电压抑制,见[issue#4](https://github.com/NanjingForestryUniversity/valveboard/issues/4)
|
||||||
- 修正了高电压时间为0.2ms
|
- 修正了高电压时间为0.2ms
|
||||||
|
|
||||||
|
### 当前版本
|
||||||
|
|
||||||
|
- 暂且添加每路阀独立的开启超时为200ms,见[issue#6](https://github.com/NanjingForestryUniversity/valveboard/issues/6)
|
||||||
|
- 通讯中断超时从原来的1s修改为200ms
|
||||||
|
|||||||
@ -1,3 +1,3 @@
|
|||||||
Quartus_Version = Version 20.1.1 Build 720 11/11/2020 SJ Lite Edition
|
Quartus_Version = Version 20.1.1 Build 720 11/11/2020 SJ Lite Edition
|
||||||
Version_Index = 520278016
|
Version_Index = 520278016
|
||||||
Creation_Time = Wed Aug 24 13:05:50 2022
|
Creation_Time = Wed Aug 24 21:50:38 2022
|
||||||
|
|||||||
@ -6,8 +6,8 @@ module tb_valveboard_firmware();
|
|||||||
reg line_sen;
|
reg line_sen;
|
||||||
reg line_sdata;
|
reg line_sdata;
|
||||||
|
|
||||||
wire [48:0] signal_high_voltage;
|
wire [47:0] signal_high_voltage;
|
||||||
wire [48:0] signal_low_voltage;
|
wire [47:0] signal_low_voltage;
|
||||||
|
|
||||||
valveboard_firmware inst_valveboard_firmware(
|
valveboard_firmware inst_valveboard_firmware(
|
||||||
.sys_clk (sys_clk),
|
.sys_clk (sys_clk),
|
||||||
@ -38,7 +38,7 @@ module tb_valveboard_firmware();
|
|||||||
valve_data = valve_data + 1;
|
valve_data = valve_data + 1;
|
||||||
line_sen = 1;#50;
|
line_sen = 1;#50;
|
||||||
for (idx = 0; idx < 48; idx = idx + 1) begin
|
for (idx = 0; idx < 48; idx = idx + 1) begin
|
||||||
if (valve_data[idx] == 0) begin
|
if (valve_data[idx] == 1) begin
|
||||||
line_sdata = 0;#125;
|
line_sdata = 0;#125;
|
||||||
line_sclk = 1;#125;
|
line_sclk = 1;#125;
|
||||||
line_sdata = 1;#125;
|
line_sdata = 1;#125;
|
||||||
|
|||||||
@ -262,8 +262,8 @@ set_global_assignment -name EDA_GENERATE_FUNCTIONAL_NETLIST OFF -section_id eda_
|
|||||||
set_global_assignment -name EDA_GENERATE_FUNCTIONAL_NETLIST OFF -section_id eda_board_design_signal_integrity
|
set_global_assignment -name EDA_GENERATE_FUNCTIONAL_NETLIST OFF -section_id eda_board_design_signal_integrity
|
||||||
set_global_assignment -name EDA_GENERATE_FUNCTIONAL_NETLIST OFF -section_id eda_board_design_boundary_scan
|
set_global_assignment -name EDA_GENERATE_FUNCTIONAL_NETLIST OFF -section_id eda_board_design_boundary_scan
|
||||||
set_global_assignment -name EDA_TEST_BENCH_ENABLE_STATUS TEST_BENCH_MODE -section_id eda_simulation
|
set_global_assignment -name EDA_TEST_BENCH_ENABLE_STATUS TEST_BENCH_MODE -section_id eda_simulation
|
||||||
set_global_assignment -name EDA_NATIVELINK_SIMULATION_TEST_BENCH normal_test -section_id eda_simulation
|
set_global_assignment -name EDA_NATIVELINK_SIMULATION_TEST_BENCH nnormal_test -section_id eda_simulation
|
||||||
set_global_assignment -name EDA_TEST_BENCH_NAME normal_test -section_id eda_simulation
|
set_global_assignment -name EDA_TEST_BENCH_NAME nnormal_test -section_id eda_simulation
|
||||||
set_global_assignment -name EDA_DESIGN_INSTANCE_NAME NA -section_id normal_test
|
set_global_assignment -name EDA_DESIGN_INSTANCE_NAME NA -section_id nnormal_test
|
||||||
set_global_assignment -name EDA_TEST_BENCH_MODULE_NAME normal_test -section_id normal_test
|
set_global_assignment -name EDA_TEST_BENCH_MODULE_NAME nnormal_test -section_id nnormal_test
|
||||||
set_global_assignment -name EDA_TEST_BENCH_FILE tb_valveboard_firmware.v -section_id normal_test
|
set_global_assignment -name EDA_TEST_BENCH_FILE tb_valveboard_firmware.v -section_id nnormal_test
|
||||||
@ -1,6 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
丁坤的阀板程序v1.3 2022/8/24
|
丁坤的阀板程序v1.4-beta1 2022/8/24
|
||||||
对应b02-h1.3-p1.1-f1.3
|
|
||||||
经测试,高压时间改为0.2ms
|
经测试,高压时间改为0.2ms
|
||||||
使用的是合肥的阀,1.5A电流需0.2ms的100V(阀标称100V,现场供电为96V)高电压
|
使用的是合肥的阀,1.5A电流需0.2ms的100V(阀标称100V,现场供电为96V)高电压
|
||||||
*/
|
*/
|
||||||
@ -21,15 +20,14 @@ module valveboard_firmware(
|
|||||||
parameter CHANNEL_NUM_MINUS_1 = CHANNEL_NUM - 1;
|
parameter CHANNEL_NUM_MINUS_1 = CHANNEL_NUM - 1;
|
||||||
parameter HIGH_VOLTAGE_TIME = 32'd4000; // 高压时间HIGH_VOLTAGE_TIME / 20MHz = 0.2ms
|
parameter HIGH_VOLTAGE_TIME = 32'd4000; // 高压时间HIGH_VOLTAGE_TIME / 20MHz = 0.2ms
|
||||||
parameter HIGH_VOLTAGE_TIME_MINUS_1 = HIGH_VOLTAGE_TIME - 1;
|
parameter HIGH_VOLTAGE_TIME_MINUS_1 = HIGH_VOLTAGE_TIME - 1;
|
||||||
parameter FAULT_COUNTER_THRESHOLD = 32'd20_000_000; // 通讯中断超过FAULT_COUNTER_THRESHOLD / 20MHz = 1s,就关所有阀
|
parameter LONGOPEN_COUNTER_THRESHOLD = 7'd20; // 一路阀打开超过LONGOPEN_COUNTER_THRESHOLD * 200_000 / 20MHz = 200ms就关闭
|
||||||
parameter FAULT_COUNTER_THRESHOLD_MINUS_1 = FAULT_COUNTER_THRESHOLD - 1;
|
parameter DISCONNECT_FAULT_COUNTER_THRESHOLD = 32'd4_000_000; // 通讯中断超过FAULT_COUNTER_THRESHOLD / 20MHz = 200ms,就关所有阀
|
||||||
parameter FAULT_COUNTER_THRESHOLD_PLUS_1 = FAULT_COUNTER_THRESHOLD + 1;
|
parameter DISCONNECT_FAULT_COUNTER_THRESHOLD_MINUS_1 = DISCONNECT_FAULT_COUNTER_THRESHOLD - 1;
|
||||||
|
parameter DISCONNECT_FAULT_COUNTER_THRESHOLD_PLUS_1 = DISCONNECT_FAULT_COUNTER_THRESHOLD + 1;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
reg [CHANNEL_NUM_MINUS_1:0] cache_signal_high_voltage;
|
|
||||||
reg [31:0] i;
|
reg [31:0] i;
|
||||||
reg [31:0] fault_counter;
|
reg [31:0] disconnect_fault_counter;
|
||||||
reg [0:0] fault_flag [0:7]; // fault_flag支持8类错误信号
|
reg [0:0] fault_flag [0:7]; // fault_flag支持8类错误信号
|
||||||
|
|
||||||
|
|
||||||
@ -171,27 +169,27 @@ module valveboard_firmware(
|
|||||||
end
|
end
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 若通讯中断,超过FAULT_COUNTER_THRESHOLD个csys_clk就置位fault_flag[1]
|
* 若通讯中断,超过DISCONNECT_FAULT_COUNTER_THRESHOLD个csys_clk就置位fault_flag[1]
|
||||||
* fault_flag[1]在posedge_line_sclk上升沿时刻清楚
|
* fault_flag[1]在posedge_line_sclk上升沿时刻清楚
|
||||||
*/
|
*/
|
||||||
always @(posedge sys_clk or negedge rst_n) begin
|
always @(posedge sys_clk or negedge rst_n) begin
|
||||||
if (!rst_n) begin
|
if (!rst_n) begin
|
||||||
fault_counter <= 0;
|
disconnect_fault_counter <= 0;
|
||||||
fault_flag[1] <= 0;
|
fault_flag[1] <= 0;
|
||||||
end
|
end
|
||||||
else if ({cache_line_sclk, line_sclk} == 6'b011111) begin
|
else if ({cache_line_sclk, line_sclk} == 6'b011111) begin
|
||||||
fault_counter <= 0;
|
disconnect_fault_counter <= 0;
|
||||||
fault_flag[1] <= 0;
|
fault_flag[1] <= 0;
|
||||||
end
|
end
|
||||||
else begin
|
else begin
|
||||||
if (fault_counter >= FAULT_COUNTER_THRESHOLD_PLUS_1)
|
if (disconnect_fault_counter >= DISCONNECT_FAULT_COUNTER_THRESHOLD_PLUS_1)
|
||||||
fault_flag[1] <= 1;
|
fault_flag[1] <= 1;
|
||||||
else if (fault_counter >= FAULT_COUNTER_THRESHOLD_MINUS_1) begin
|
else if (disconnect_fault_counter >= DISCONNECT_FAULT_COUNTER_THRESHOLD_MINUS_1) begin
|
||||||
fault_counter <= fault_counter + 1;
|
disconnect_fault_counter <= disconnect_fault_counter + 1;
|
||||||
fault_flag[1] <= 1;
|
fault_flag[1] <= 1;
|
||||||
end
|
end
|
||||||
else begin
|
else begin
|
||||||
fault_counter <= fault_counter + 1;
|
disconnect_fault_counter <= disconnect_fault_counter + 1;
|
||||||
fault_flag[1] <= 0;
|
fault_flag[1] <= 0;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -283,12 +281,78 @@ module valveboard_firmware(
|
|||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 对系统时钟做分频得到100Hz的脉冲信号,后续用于判断阀是否长时间开启
|
||||||
|
* 这样是不严谨的,应当以数据接收完成时刻开始计时,但CPLD资源不够了
|
||||||
|
*/
|
||||||
|
reg [17:0] sys_clk_divider;
|
||||||
|
reg sys_clk_div;
|
||||||
|
always @(posedge sys_clk or negedge rst_n) begin
|
||||||
|
if (!rst_n) begin
|
||||||
|
sys_clk_divider <= 0;
|
||||||
|
sys_clk_div <= 0;
|
||||||
|
end
|
||||||
|
else if (total_fault_flag) begin
|
||||||
|
sys_clk_divider <= 0;
|
||||||
|
sys_clk_div <= 0;
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
if (sys_clk_divider == 199_999) begin
|
||||||
|
sys_clk_divider <= 0;
|
||||||
|
sys_clk_div <= 1;
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
sys_clk_divider <= sys_clk_divider + 1;
|
||||||
|
sys_clk_div <= 0;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 在100Hz的脉冲信号时更新每路阀的开启时间计数器
|
||||||
|
* 到达超时时间后暂停计数
|
||||||
|
* 用100Hz的信号的原因是资源不够,必须减少计数器位宽
|
||||||
|
* 这导致计数器存在随机的单周期不稳定时间
|
||||||
|
*/
|
||||||
|
reg [7:0] longopen_counter [0:CHANNEL_NUM_MINUS_1];
|
||||||
|
integer k;
|
||||||
|
always @(posedge sys_clk or negedge rst_n) begin
|
||||||
|
if (!rst_n) begin
|
||||||
|
for (k = 0; k < CHANNEL_NUM; k = k + 1) begin
|
||||||
|
longopen_counter[k] <= 0;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else if (total_fault_flag) begin
|
||||||
|
for (k = 0; k < CHANNEL_NUM; k = k + 1) begin
|
||||||
|
longopen_counter[k] <= 0;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
for (k = 0; k < CHANNEL_NUM; k = k + 1) begin
|
||||||
|
if (cache2_line_sdata[k] == 0) begin
|
||||||
|
if (sys_clk_div && (longopen_counter[k] < LONGOPEN_COUNTER_THRESHOLD))
|
||||||
|
longopen_counter[k] <= longopen_counter[k] + 7'd1;
|
||||||
|
else
|
||||||
|
longopen_counter[k] <= longopen_counter[k];
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
longopen_counter[k] <= 0;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 高电压时间内(is_high_voltage_time高电平时),按cache2_line_sdata打开所需高电压;高电压时间后关闭
|
* 高电压时间内(is_high_voltage_time高电平时),按cache2_line_sdata打开所需高电压;高电压时间后关闭
|
||||||
* 需要注意的是,已经开着的喷阀, 在高压时间内,不会再次使用高电压,只是保持低电压
|
|
||||||
* 按cache2_line_sdata打开低电压
|
* 按cache2_line_sdata打开低电压
|
||||||
|
* 需要注意的是,已经开着的喷阀, 在高压时间内,不会再次使用高电压,只是保持低电压
|
||||||
|
* 此外,根据开启时间计数器是否超时来决定是否关闭某路阀
|
||||||
* total_fault_flag会关闭所有喷阀
|
* total_fault_flag会关闭所有喷阀
|
||||||
*/
|
*/
|
||||||
|
integer m;
|
||||||
|
// 已经开着的喷阀,在高压时间内,不会再次使用高电压,只是保持低电压
|
||||||
|
wire [CHANNEL_NUM_MINUS_1:0] signal_high_voltage_wire = ~last_line_sdata | cache2_line_sdata;
|
||||||
always @ (posedge sys_clk or negedge rst_n) begin
|
always @ (posedge sys_clk or negedge rst_n) begin
|
||||||
if (!rst_n) begin
|
if (!rst_n) begin
|
||||||
signal_low_voltage <= ~0;
|
signal_low_voltage <= ~0;
|
||||||
@ -299,13 +363,17 @@ module valveboard_firmware(
|
|||||||
signal_high_voltage <= ~0;
|
signal_high_voltage <= ~0;
|
||||||
end
|
end
|
||||||
else if (is_high_voltage_time) begin
|
else if (is_high_voltage_time) begin
|
||||||
// 已经开着的喷阀,在高压时间内,不会再次使用高电压,只是保持低电压
|
// 阀的开启时间不超过LONGOPEN_COUNTER_THRESHOLD
|
||||||
signal_high_voltage <= ~last_line_sdata | cache2_line_sdata;
|
for (m = 0; m < CHANNEL_NUM; m = m + 1) begin
|
||||||
signal_low_voltage <= cache2_line_sdata;
|
signal_high_voltage[m] <= signal_high_voltage_wire[m] | ~(longopen_counter[m] < LONGOPEN_COUNTER_THRESHOLD);
|
||||||
|
signal_low_voltage[m] <= cache2_line_sdata[m] | ~(longopen_counter[m] < LONGOPEN_COUNTER_THRESHOLD);
|
||||||
|
end
|
||||||
end
|
end
|
||||||
else begin
|
else begin
|
||||||
signal_high_voltage <= ~0;
|
signal_high_voltage <= ~0;
|
||||||
signal_low_voltage <= cache2_line_sdata;
|
for (m = 0;m < CHANNEL_NUM; m = m + 1) begin
|
||||||
|
signal_low_voltage[m] <= cache2_line_sdata[m] | ~(longopen_counter[m] < LONGOPEN_COUNTER_THRESHOLD);
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@ -51,7 +51,7 @@ CPLD烧录口为简牛口,用USB Blaster烧录的,开发软件为Quartus。
|
|||||||
|
|
||||||
## Changelog
|
## Changelog
|
||||||
|
|
||||||
丁坤2019年9月入学、丁坤QQ1091546069、丁坤电话17761700156,他刚入学时就被师兄叫去焊接汪学良的阀板,后来接替师兄做了这个仓库里的阀板,无论有没有毕业,都很乐意解答关于板子的所有问题
|
丁坤2019年9月入学、丁坤QQ1091546069、丁坤电话17761700156,他刚入学时就被师兄叫去焊接汪学良的阀板,后来接替师兄做了这个仓库里的阀板,作者已经毕业,但很乐意解答有关的所有问题
|
||||||
|
|
||||||
### v1.0
|
### v1.0
|
||||||
|
|
||||||
|
|||||||
@ -69,5 +69,5 @@ DS90LV048具有内置终端电阻,电路设计和布局布线只需注意匹
|
|||||||
|
|
||||||
## 作者
|
## 作者
|
||||||
|
|
||||||
**丁坤,2019年9月入学、丁坤QQ1091546069、丁坤电话17761700156**,他觉得老阀板的协议不明确(其实就没有协议,逆向工程后改进出来的这份协议),所以就大概描述了一下协议相关信息,无论有没有毕业,都很乐意解答关于这份协议的所有问题
|
**丁坤,2019年9月入学、丁坤QQ1091546069、丁坤电话17761700156**,他觉得老阀板的协议不明确(其实就没有协议,逆向工程后改进出来的这份协议),所以就大概描述了一下协议相关信息,作者已经毕业,但很乐意解答关于这份协议的所有问题
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
Loading…
Reference in New Issue
Block a user