【FPGA-Spirit_V2】基于FPGA的循迹小车-小精灵V2开发板

🎉欢迎来到FPGA专栏~基于FPGA的循迹小车


  • ☆* o(≧▽≦)o *☆~我是小夏与酒🍹
  • 博客主页:小夏与酒的博客
  • 🎈该系列文章专栏:FPGA学习之旅
  • 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏
  • 📜 欢迎大家关注! ❤️
    FPGQ2

CSDN

🎉 基于FPGA的循迹小车

  • 一、效果演示
  • 二、搭建硬件
    • 🥝开发板详细介绍
    • 🥝完整的循迹小车
  • 三、程序编写
    • 🍊整体编程思路
    • 🍊PWM模块
    • 🍊LCD模块
    • 🍊顶层模块
  • 四、调试及结果分析
    • 🍋调试注意事项
    • 🍋结果分析

遇见未来

一、效果演示

基于FPGA的循迹小车【Spirit_V2】

由于场地的问题,打滑现象严重,所以用手轻推辅助小车前进。

对于效果演示的分析,见调试及结果分析

二、搭建硬件

该系列文章只是作为学习记录,并无其余用途。所发文章内容是经过自己本身操作和记录整理得来。

本篇文章记录基于小精灵V2(Spirit_V2)开发板的循迹小车

❤️特别鸣谢:小月电子工作室
🔸【小月电子】大佬博客链接:Moon_3181961725
🔸【FPGA】Altera Cyclone IV EP4CE6入门系统板购买链接:EP4CE6
🔸【FPGA】智能小车驱动板购买链接:FPGA小车驱动版
🔸【FPGA】配套电池与充电器购买链接:电池与充电器
❤️有不清楚的地方可以咨询客服:小月电子工作室淘宝店铺

🥝开发板详细介绍

开发板详细介绍:【FPGA-Spirit_V2】小精灵V2开发板初使用

🥝完整的循迹小车

一套完整的循迹小车包括:核心控制板、小车驱动板、电源和循迹模块

红外循迹模块基本介绍和使用:红外循迹模块使用介绍。

按照店铺提供的资料,组装好小车驱动板,加上循迹模块,效果如下:
完整图
小车烧录程序时的连线图:
烧录程序

三、程序编写

🍊整体编程思路

本次项目的编程思路见下图的思维导图:
编程思路

对于循迹过程,使用红外传感器来判断是否检测到黑线:如果检测到黑线,模块输出低电平;如果没有检测到黑线,模块输出高电平

使用最简单的电机差速来控制小车的循迹过程:如果左侧的传感器检测到黑线,那么左侧电机停止转动,右侧电机继续转动;如果右侧的传感器检测到黑线,那么右侧电机停止转动,左侧电机继续转动;如果两个传感器都没有检测到黑线,那么两个电机以相同的速度同时运行。

该项目主要需要使用到PWM模块LCD模块

🍊PWM模块

PWM是用来控制电机转速的。在使用电机差速来控制循迹时,也可以让一侧的电机转速低于另一侧,而不是使一侧停止转动,使用该方法可以更加丝滑快速地完成转向。

小月电子提供的PWM模块:

//脉冲生成模块,通过控制输出脉冲频率及占空比来控制小车的速度 
module ctrl_moto_pwm(
	input					clk								,//时钟50M
	input					rst_n								,//复位,低电平有效
	input	[7:0]			spd_high_time,
	input	[7:0]			spd_low_time ,
	output				period_fini,
	output	reg		pwm								 //脉冲信号										
	);
				
	//状态机
	parameter			idle								= 8'h0,//空闲状态 
						step_high 							= 8'h1,//脉冲高电平状态,当为该状态时,pwm为高电平
						step_low  							= 8'h2;//脉冲低电平状态,当为该状态时,pwm为低电平
						
	reg	[7:0]		curr_st			;
	reg	[7:0]		curr_st_ff1		;
	reg	[10:0]	step_high_time	;
	reg	[10:0]	step_low_time	;
	reg	[10:0]	step_high_cnt	;
	reg	[10:0]	step_low_cnt	;
	// wire[10:0]	spd_high_time;
	// wire[10:0]	spd_low_time ;
	wire[10:0]	hspd_high_time;
	wire[10:0]	hspd_low_time ;
	// assign	spd_high_time=20;
	// assign	spd_low_time =10;
	assign	period_fini=(step_low_cnt==step_low_time)?1'b1:1'b0;
	always@(posedge clk or negedge rst_n)
		begin
			if(!rst_n)
				begin
					step_high_time<=0;
					step_low_time<=0;
				end
			else
				begin
					step_high_time<=spd_high_time;
					step_low_time<=spd_low_time;
				end
		end
	always@(posedge clk)curr_st_ff1<=curr_st	;
	always@(posedge clk or negedge rst_n)
		begin
			if(!rst_n)
				curr_st<=idle;
			else case(curr_st)
				idle:curr_st<=step_high	;
				step_high:
					begin
						if(step_high_cnt==step_high_time)
							curr_st<=step_low;
						else
							;
					end
				step_low:
					begin
						if(step_low_cnt==step_low_time)
							curr_st<=step_high;
						else
							;
					end
				default:;
			endcase
		end
	always@(posedge clk or negedge rst_n)
		begin
			if(!rst_n)
				step_high_cnt<=0;
			else if(curr_st==idle)
				step_high_cnt<=0;
			else if(curr_st==step_high)
				step_high_cnt<=step_high_cnt+1;
			else
				step_high_cnt<=0;
		end
	always@(posedge clk or negedge rst_n)
		begin
			if(!rst_n)
				step_low_cnt<=0;
			else if(curr_st==idle)
				step_low_cnt<=0;
			else if(curr_st==step_low)
				step_low_cnt<=step_low_cnt+1;
			else
				step_low_cnt<=0;
		end
	always@(posedge clk or negedge rst_n)
		begin
			if(!rst_n)
				begin
					pwm<=0;
				end
			else if(curr_st==idle)
				begin
					pwm<=0;
				end
			else if(curr_st==step_high)
				pwm<=1;
			else if(curr_st==step_low)
				pwm<=0;
			else
				pwm<=1;
		end
endmodule

🍊LCD模块

LCD液晶屏模块主要是用来显示数据的,通过显示的数据,可以帮助我们进行更高效的调试。在该项目中,LCD只用来显示字符。

LCD1602模块:

//模块介绍:LCD1602显示驱动
module lcd ( 
	input 					clk		,//系统时钟输入50M
	input						rst_n	,//复位,低电平有效
 	output 	reg	[7:0] dat		,//LCD的8位数据口
 	output  	reg			rs		,//数据命令选择信号,高电平表示数据,低电平表示命令
 	output					rw		,//读写标志,高电平表示读,低电平表示写,该程序我们只对液晶屏进行写操作
 	output					en		//LCD的控制脚
 );
	 reg	[15:0]	counter	; 
	 reg 	[ 5:0] 	current	; 
	 reg 				clkr	; 
	 reg				e		;
	 //定义了LCD状态机需要的状态。
	 parameter  set0 =6'd0; 
	 parameter  set1 =6'd1; 
	 parameter  set2 =6'd2; 
	 parameter  set3 =6'd3; 
	 parameter  set4 =6'd4;   
	 parameter  dat0 =6'd5; 
	 parameter  dat1 =6'd6; 
	 parameter  dat2 =6'd7; 
	 parameter  dat3 =6'd8; 
	 parameter  dat4 =6'd9; 
	 parameter  dat5 =6'd10;
	 parameter  dat6 =6'd11; 
	 parameter  dat7 =6'd12; 
	 parameter  dat8 =6'd13; 
	 parameter  dat9 =6'd14;
	 parameter  dat10=6'd15; 
	 parameter  dat11=6'd16;
	 parameter	dat12=6'd17;  
	 parameter	dat13=6'd18; 
	 parameter	dat14=6'd19; 
	 parameter	dat15=6'd20; 
	 parameter  fini=6'hF1; 
	 
	always @(posedge clk or negedge rst_n)         //da de data_w1 zhong pinlv 
	 begin 
		if(!rst_n)
			begin
				counter<=0;
				clkr<=0;
			end
		else
			begin
				counter<=counter+1; 
				if(counter==16'h000f)  
					clkr=~clkr; 
				else
					;
			end
	end 
	
	always @(posedge clkr or negedge rst_n) 
	begin 
		if(!rst_n)
			begin
				current<=set0;
				dat<=0;
				rs<=0;
				e<=1;
			end
		else
			begin
				case(current) 
				set0:   begin  e<=0;rs<=0; dat<=8'h38; 	current<=set1; 		end //*设置8位格式,2行,5*7*
				set1:   begin  e<=0;rs<=0; dat<=8'h0C; 	current<=set2; 		end //*整体显示,关光标,不闪烁*/  
				set2:   begin  e<=0;rs<=0; dat<=8'h06; 	current<=set3; 		end //*设定输入方式,增量不移位*/  
				set3:   begin  e<=0;rs<=0; dat<=8'h01; 	current<=set4; 		end //*清除显示*/   
				set4:   begin  e<=0;rs<=0; dat<=8'h00; 	current<=dat0; 		end //设置显示第一行
				dat0:   begin  e<=0;rs<=1; dat<="H"; 	current<=dat1; 		end    
				dat1:   begin  e<=0;rs<=1; dat<="E"; 	current<=dat2; 		end 
				dat2:   begin  e<=0;rs<=1; dat<="L"; 	current<=dat3; 		end 
				dat3:   begin  e<=0;rs<=1; dat<="L";	current<=dat4; 		end 
				dat4:   begin  e<=0;rs<=1; dat<="O"; 	current<=dat5; 		end 
				dat5:   begin  e<=0;rs<=1; dat<=" "; 	current<=dat6; 		end 
				dat6:   begin  e<=0;rs<=1; dat<="S"; 	current<=dat7; 		end 
				dat7:   begin  e<=0;rs<=1; dat<="p";	current<=dat8; 		end 
				dat8:   begin  e<=0;rs<=1; dat<="i"; 	current<=dat9; 		end 
				dat9:   begin  e<=0;rs<=1; dat<="r";	current<=dat10 ; 	end 
				dat10:  begin  e<=0;rs<=1; dat<="i"; 	current<=dat11; 	end 
				dat11:  begin  e<=0;rs<=1; dat<="t"; 	current<=dat12; 	end 
				dat12:  begin  e<=0;rs<=1; dat<="_"; 	current<=dat13; 	end 
				dat13:  begin  e<=0;rs<=1; dat<="V"; 	current<=dat14; 	end 
				dat14:  begin  e<=0;rs<=1; dat<="2"; 	current<=dat15; 	end 
				dat15:  begin  e<=0;rs<=1; dat<="!"; 	current<=fini; 		end 
				fini:   begin  e<=1;rs<=0; dat<=8'h00;       				end
				default:   current<=set0; 
				endcase 
			end
	 end
	 
	assign en=clkr|e;
	assign rw=0;
	
endmodule 

上述代码的LCD显示效果如下:
LCD

🍊顶层模块

该项目中的顶层模块主要用于控制循迹过程。

同时,通过板载的按键模块来控制小车的启动与停止:
按键模块
板载按键模块低电平时有效,代码:

//通过标志位flag判断小车是否开启运行
always@(posedge clk or negedge rst_n)begin
	if(!rst_n)
		flag <= 0;
	else if(!key && !flag)
		flag <= 1;
	else
		flag <= flag;
end

最后,加入蜂鸣器来更好地判断小车是否检测到黑线。板载蜂鸣器为有源蜂鸣器,低电平时发出声音,控制代码:

always@(posedge clk or negedge rst_n)begin
	if(!rst_n)
		beep_key <= 0;
	else if(track1 == 1 && track2 == 0)
		beep_key <= 1;
	else if(track1 == 0 && track2 == 1)
		beep_key <= 1;
	else if(track3 == 1 && track4 == 0)
		beep_key <= 1;
	else if(track3 == 0 && track4 == 1)
		beep_key <= 1;
	else
		beep_key <= 0;	
end
	
	//加入蜂鸣器来查看小车的转向情况
	assign beep = beep_key?1'b0:1'b1;

完整的顶层模块代码:

module car_top(
	input	clk,//50MHZ
	input rst_n,//全局复位,低电平有效
	input key,//控制小车是否开始运行
	
	input track1,
	input track2,
	
	input track3,
	input track4,
	
	output	reg	dir_l_1=0,//控制左电机正转或者反转
	output	reg	dir_l_2=0,
	
	output	reg	dir_r_1=0,//控制右电机正转或者反转
	output	reg	dir_r_2=0,
	
	output	reg	f_pwm_l=0,//左电机pwm值
	output	reg	f_pwm_r=0,//右电机pwm值
	
	output 			[7:0]udat,//LCD的8位数据口
 	output  			urs,//数据命令选择信号,高电平表示数据,低电平表示命令
 	output			urw,//读写标志,高电平表示读,低电平表示写,该程序我们只对液晶屏进行写操作
 	output			uen,//LCD的控制脚
	
	output beep
	);
	
	reg	[1:0] flag = 0;
	reg	[1:0] beep_key = 0;
	
	ctrl_moto_pwm uctrl_moto_pwm(
	.clk(clk),//时钟50M
	.rst_n(rst_n),//复位,低电平有效
	.spd_high_time(10),
	.spd_low_time(75),
	.period_fini(),
	.pwm(pwm)//脉冲信号										
	);
	
	lcd Ulcd( 
	.clk(clk),
	.rst_n(rst_n),
 	.dat(udat),
 	.rs(urs),
 	.rw(urw),
 	.en(uen)
	);
	
	//通过标志位flag判断小车是否开启运行
	always@(posedge clk or negedge rst_n)begin
		if(!rst_n)
			flag <= 0;
		else if(!key && !flag)
			flag <= 1;
		else
			flag <= flag;
	end
	
	//循迹与差速转向
	always@(posedge clk)begin
		//当标志位flag为0时,小车静止
		if(flag == 0)begin
			dir_l_1<=0;
			dir_l_2<=0;
			f_pwm_l<=0;
			
			dir_r_1<=0;
			dir_r_2<=0;
			f_pwm_r<=0;
		end 
		
		//当标志位flag为1时,小车开始循迹
		else if(flag==1)begin
			//当两侧传感器都没有检测到黑线时,两轮同时行进
			if(track1 == 0 && track2 == 0)begin
				dir_l_1<=0;
				dir_l_2<=1;
				f_pwm_l<=pwm;
				
				dir_r_1<=0;
				dir_r_2<=1;
				f_pwm_r<=pwm;
			end
			
			//内-向右调整
			else if(track1 == 0 && track2 == 1)begin
				dir_l_1<=0;
				dir_l_2<=1;
				f_pwm_l<=pwm;
				
				dir_r_1<=0;
				dir_r_2<=0;
				f_pwm_r<=0;
			end
			
			//内-向左调整
			else if(track1 == 1 && track2 == 0)begin
				dir_l_1<=0;
				dir_l_2<=0;
				f_pwm_l<=0;
			   
			   dir_r_1<=0;
			   dir_r_2<=1;
			   f_pwm_r<=pwm;
			end
			
			//外-向右调整
			else if(track3 == 1 && track4 == 0 && track1 == 1 && track2 == 1)begin
				dir_l_1<=0;
				dir_l_2<=0;
				f_pwm_l<=0;
				
				dir_r_1<=0;
				dir_r_2<=1;
				f_pwm_r<=pwm;
			end
			
			//外-向左调整
			else if(track3 == 0 && track4 == 1 && track1 == 1 && track2 == 1)begin
				dir_l_1<=0;
				dir_l_2<=1;
				f_pwm_l<=pwm;
			   
			   dir_r_1<=0;
			   dir_r_2<=0;
			   f_pwm_r<=0;
			end
			
			//当内部两个红外传感器都检测不到黑线时,停止运动
			else if(track1 == 1 && track2 == 1)begin
				dir_l_1<=0;
				dir_l_2<=0;
				f_pwm_l<=0;
				
				dir_r_1<=0;
				dir_r_2<=0;
				f_pwm_r<=0;
			end
		end 
			
		else;
		
	end
	
	always@(posedge clk or negedge rst_n)begin
		if(!rst_n)
			beep_key <= 0;
		else if(track1 == 1 && track2 == 0)
			beep_key <= 1;
		else if(track1 == 0 && track2 == 1)
			beep_key <= 1;
		else if(track3 == 1 && track4 == 0)
			beep_key <= 1;
		else if(track3 == 0 && track4 == 1)
			beep_key <= 1;
		else
			beep_key <= 0;	
	end
	
	//加入蜂鸣器来查看小车的转向情况
	assign beep = beep_key?1'b0:1'b1;
		
endmodule 

RTL视图:
RTL
本项目使用了四个循迹模块(四路循迹),在代码编写的过程中也可以把循迹部分和蜂鸣器部分单独封装成模块的形式,方便在顶层模块的调用。

四、调试及结果分析

🍋调试注意事项

🔸需要根据黑线的宽度调整好红外模块的位置和方向;
🔸调整好合适的红外模块灵敏度(电阻值);
🔸选择一个合适的循迹场地,地面平整,不会打滑;
🔸调整好合适的PWM。

🍋结果分析

🔸本次测试场地会导致打滑现象的出现;
🔸没有调整好合适的PWM,导致小车前轮有时几乎不转;
🔸小车在行驶过程中遇到阻碍使轮子停止转动时,需要立刻将小车调入待机状态或者关闭电源,否则会导致电机驱动模块发烫。

csdn

🧸结尾


  • ❤️ 感谢您的支持和鼓励! 😊🙏
  • 📜您可能感兴趣的内容:
  • 【FPGA零基础学习之旅#1】 AC620V2开发板测试
  • 【Go黑帽子】使用Golang编写一个TCP扫描器(基础篇)
  • 【Arduino TinyGo】【最新】使用Go语言编写Arduino-环境搭建和点亮LED灯
  • 【Labview-3D虚拟平台】Labview与Solidworks联合仿真(保姆级)(下)装配体、父级与子级
    遇见未来

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/8234.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android下载apk并安装apk(用于软件版本升级用途)

软件版本更新是每个应用必不可少的功能&#xff0c;基本实现方案是请求服务器最新的版本号与本地的版本号对比&#xff0c;有新版本则下载apk并执行安装。请求服务器版本号与本地对比很容易&#xff0c;本文就不过多讲解&#xff0c;主要讲解下载apk到安装apk的内容。 一、所需…

Socket套接字编程(实现TCP和UDP的通信)

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…

(链表)移除链表元素(双指针法)

文章目录前言&#xff1a;问题描述&#xff1a;解题思路&#xff08;双指针法&#xff09;&#xff1a;代码实现&#xff1a;总结&#xff1a;前言&#xff1a; 此篇是针对链表的经典练习题。 问题描述&#xff1a; 给你一个链表的头节点 head 和一个整数 val &#xff0c;请…

Js:apply/call/bind、作用域/闭包、this指向(普通,箭头,JS/Vue的this)

目录1、apply/call/bind2、作用域、作用域链和闭包核心1、预处理&#xff08;解析阶段&#xff09;——JS执行“代码段”之前2、生成执行上下文环境——对代码段(全局/函数体)进行处理3、执行上下文环境小结4、多个执行上下文环境5、作用域6、作用域和执行上下文7、从【自由变量…

小米万兆路由器里的 Docker 安装 Gitea

小米万兆路由器里的 Docker 安装 Gitea准备工作创建存储查看Docker Hub镜像信息拉取 gitea 镜像和运行容器配置通过 ssh 访问(Optional)其他小米2022年12月份发布了万兆路由器&#xff0c;里面可以使用Docker。 今天尝试在小米的万兆路由器里安装Gitea。 准备工作 先将一块US…

Java企业级开发学习笔记(2.1)MyBatis实现简单查询

该文章主要为完成实训任务&#xff0c;详细实现过程及结果见【http://t.csdn.cn/zi0wB】 文章目录零、创建数据库与表一、基于配置文件方式使用MyBatis基本使用1.1 创建Maven项目 - MyBatisDemo1.2 在pom文件里添加相应的依赖1.3 创建与用户表对应的用户实体类 - User1.4 创建用…

没有他们,人工智能只能死翘翘

我过去写过一篇文章《很多所谓伟大的贡献&#xff0c;其实都是狗屎运》&#xff0c;今天我也写写人工智能。&#xff08;1&#xff09;人才深度神经网络如果不从明斯基和罗森布拉特说起&#xff0c;那就应该可以从1965年Ivakhnenko发明前馈神经网络说起。但关键里程碑是出自Rum…

SpringBoot2核心功能 --- 原理解析

一、Profile功能 为了方便多环境适配&#xff0c;springboot简化了profile功能。 1.1、application-profile功能 默认配置文件 application.yaml&#xff1b;任何时候都会加载指定环境配置文件 application-{env}.yaml激活指定环境配置文件激活 命令行激活&#xff1a;java -…

【快乐手撕LeetCode题解系列】—— 环形链表 II

【快乐手撕LeetCode题解系列】—— 环形链表 II&#x1f60e;前言&#x1f64c;环形链表 II&#x1f64c;画图分析&#xff1a;&#x1f60d;思路分析&#xff1a;&#x1f60d;源代码分享&#xff1a;&#x1f60d;总结撒花&#x1f49e;&#x1f60e;博客昵称&#xff1a;博客…

STM32与Python上位机通过USB虚拟串口通信

文章目录前言1. 查看原理图2. 新建工程3.添加代码与烧录4. python代码编写总结问题解决思路前言 在详细阅读广大网友的教程之后&#xff0c;我对STM32和Python通过USB通信的流程烂熟于心。 尝试用ST公司的NUCLEO-L476RG板子进行简单的回环通信测试&#xff0c;发现还是存在网上…

Linux·异步IO编程框架

hi&#xff0c;大家好&#xff0c;今天分享一篇Linux异步IO编程框架文章&#xff0c;对比IO复用的epoll框架&#xff0c;到底性能提高多少&#xff1f;让我们看一看。 译者序 本文组合翻译了以下两篇文章的干货部分&#xff0c;作为 io_uring 相关的入门参考&#xff1a; Ho…

【RocketMQ】顺序消息实现原理

全局有序 在RocketMQ中&#xff0c;如果使消息全局有序&#xff0c;可以为Topic设置一个消息队列&#xff0c;使用一个生产者单线程发送数据&#xff0c;消费者端也使用单线程进行消费&#xff0c;从而保证消息的全局有序&#xff0c;但是这种方式效率低&#xff0c;一般不使用…

Web 攻防之业务安全:接口未授权访问/调用测试(敏感信息泄露)

Web 攻防之业务安全&#xff1a;接口未授权访问/调用测试 业务安全是指保护业务系统免受安全威胁的措施或手段。广义的业务安全应包括业务运行的软硬件平台&#xff08;操作系统、数据库&#xff0c;中间件等&#xff09;、业务系统自身&#xff08;软件或设备&#xff09;、业…

ViT/vit/VIT详解

参考&#xff1a; Vision Transformer详解: https://blog.csdn.net/qq_37541097/article/details/118242600 目录&#xff1a; x.1 (论文中)模型理解x.2 代码理解 建议阅读时间&#xff1a;10min x.1 模型理解 ViT是发表在ICLR2021上的一篇文章&#xff0c;通过将图片分割…

Java并发控制 学习笔记1

一、并发控制的方法 1、悲观锁&#xff1a;常用的互斥锁都属于悲观锁&#xff0c;一个线程访问共享资源时其他线程不能访问。 2、乐观锁&#xff1a;允许同时访问共享数据&#xff0c;只有在提交时利用如版本号检查是否有冲突&#xff0c;应用github。 3、什么时候用乐观锁、什…

携程平台增长部总经理王绩强:原生互联网企业正在经历一场数字升级丨数据猿专访...

‍数据智能产业创新服务媒体——聚焦数智 改变商业以大数据和人工智能为核心&#xff0c;众多新兴技术开始赋能数字营销。于是&#xff0c;智能营销已然从工具化走向了业务化。如今&#xff0c;数字化营销已经成为了企业数字化转型中的重要一环。相较于传统营销逻辑&#xff0…

新版新款影视直播粉红色UI的麻豆CMS源码/带教程/支付已接

基于苹果CMS v10影视系统框架开发的前端模板&#xff0c;带会员中心&#xff0c;可设置试看付费观看等功能。 经过测试及修复&#xff0c;这套源码功能还是很强大的&#xff0c;可以设置一键采集&#xff0c;并且支付我们给他接到了易支付&#xff0c;拓展性强&#xff0c;基本…

【压测】通过Jemeter进行压力测试(超详细)

文章目录背景一、前言二、关于JMeter三、准备工作四、创建测试4.1、创建线程组4.2、配置元件4.3、构造HTTP请求4.4、添加HTTP请求头4.5、添加断言4.6、添加察看结果树4.7、添加Summary Report4.8、测试计划创建完成五、执行测试计划总结背景 通过SpringCloudGateway整合Nacos进…

如何下载ChatGPT-ChatGPT如何写作

CHATGPT能否改一下文章 ChatGPT 作为一种自然语言处理技术&#xff0c;生成的文章可能存在表达不够准确或文风不符合要求等问题。在这种情况下&#xff0c;可以使用编辑和修改来改变输出的文章&#xff0c;使其符合特定的要求和期望。 具体来说&#xff0c;可以采用以下步骤对…

超越竞争对手:利用Facebook A/B测试优化广告效果!

随着社交媒体广告的普及&#xff0c;Facebook已经成为了许多公司推广业务的重要平台。但是&#xff0c;在Facebook上发布广告并不意味着成功&#xff0c;这也让许多公司开始关注如何优化广告效果。 在这篇文章中&#xff0c;我将介绍如何使用A/B测试来优化Facebook广告&#x…