openmv识别红色物体并返回坐标给stm32单片机,通过pid控制舵机云台

2023-05-16

本人搜索了有关于舵机云台pid控制的代码,但是都没有搜到想要的结果,现在自己写出来了代码,所以就将自己写的代码分享出来,和大家一起学习进步。

1.openmv识别红色物体+返回中心坐标的的代码

import sensor,image,time,math,pyb,lcd
from pyb import UART,LED
import json
import ustruct
lcd.init()
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QQVGA)#QQVGA的分辨率为120*160
sensor.skip_frames(time = 2000)
sensor.set_auto_gain(False) # 关闭自动增益
sensor.set_auto_whitebal(False) #关闭白平衡
sensor.set_vflip(True)#垂直方向翻转
red_threshold_01=(18, 56, 103, 35, -57, 116)
clock = time.clock()

uart = UART(3,9600)   #定义串口3变量
uart.init(9600, bits=8, parity=None, stop=1) # init with given parameters

def find_max(blobs):    #定义寻找色块面积最大的函数
    max_size=0
    for blob in blobs:
        if blob.pixels() > max_size:
            max_blob = blob
            max_size = blob.pixels()
    return max_blob


def sending_data(cx,cy,cw,ch):
    global uart;
    data = ustruct.pack("<bbhhhhb",      #格式为俩个字符俩个短整型(2字节)
                   0x2C,                      #帧头1
                   0x12,                      #帧头2
                   int(cx), # up sample by 4   #数据1
                   int(cy), # up sample by 4    #数据2
                   int(cw), # up sample by 4    #数据1
                   int(ch), # up sample by 4    #数据2
                   0x5B)
    uart.write(data);   #必须要传入一个字节数组

led = pyb.LED(3)
while(True):
    led.on()
    clock.tick()
    img = sensor.snapshot()
    blobs = img.find_blobs([red_threshold_01])
    if blobs:
        max_b = find_max(blobs)
        cx=max_b[5]
        cy=max_b[6]
        cw=max_b[2]
        ch=max_b[3]
        img.draw_rectangle(max_b.rect(),color=(255,0,0)) # rect
        img.draw_cross(max_b[5], max_b[6]) # cx, cy
        FH = bytearray([0x2C,0x12,int(cx),int(cy),int(cw),int(ch),0x5B])
        uart.write(FH)
        print(cx,cy,cw,ch)
        lcd.display(img)
    else:
        FH = bytearray([0x2C,0x12,0,0,0,0,0x5B])
        uart.write(FH)
        img.draw_string(0,0,"no object",color = (120,0,0))
        lcd.display(img)


注意:

(1)sensor.set_framesize(sensor.QQVGA)#QQVGA的分辨率为120*160,这行代码是设置分辨率为120*160,QQVGA的分辨率为120*160,QVGA的分辨率为320*240,不同的分辨率对应stm32端的代码也不同,在追踪云台的代码里,分辨率不能设的太高,太高的话,虽然画质会更加清晰,但是画面会出现延时,响应会变慢。

(2)sensor.set_vflip(True)#垂直方向翻转,这行代码是将openmv传回的画面垂直翻转,因为我们的openmv是倒置放的,如果不进行垂直翻转,在电脑端显示的画面就是颠倒的。这行代码是否书写也会影响到后面stm32端代码的书写。

2.stm32通过pid控制舵机云台的代码

(1)usart2.c代码

#include "usart2.h"
#include "usart.h"
#include "led.h"
 int  Cx,Cy,Cw,Ch;
void uart2_init(u32 bound)
	{
  
    GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); 
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
 
	
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_USART2); 
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_USART2); 
	
	
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; 
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; 
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
	GPIO_Init(GPIOA,&GPIO_InitStructure); 


	USART_InitStructure.USART_BaudRate = bound;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_Parity = USART_Parity_No;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	
    USART_Init(USART2, &USART_InitStructure); 
	
    USART_Cmd(USART2, ENABLE); 
	
	USART_ClearFlag(USART2, USART_FLAG_TC);
	
	USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);

	
    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;		
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			
	NVIC_Init(&NVIC_InitStructure);	


	
}




void USART2_IRQHandler(void)
{

u8 com_data; 
		u8 i;
		static u8 RxCounter1=0;
		static u16 RxBuffer1[10]={0};
		static u8 RxState = 0;	
		static u8 RxFlag1 = 0;

		if( USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET)
		{
				USART_ClearITPendingBit(USART2,USART_IT_RXNE);  
				com_data = USART_ReceiveData(USART2);
			
				if(RxState==0&&com_data==0x2C)  
				{
					RxState=1;
					RxBuffer1[RxCounter1++]=com_data;
				}
		
				else if(RxState==1&&com_data==0x12) 
				{
					RxState=2;
					RxBuffer1[RxCounter1++]=com_data;
				}
		
				else if(RxState==2)
				{
					RxBuffer1[RxCounter1++]=com_data;

					if(RxCounter1>=10||com_data == 0x5B)     
					{
						RxState=3;
						RxFlag1=1;
						Cx=RxBuffer1[RxCounter1-5];
						Cy=RxBuffer1[RxCounter1-4];
						Cw=RxBuffer1[RxCounter1-3];
						Ch=RxBuffer1[RxCounter1-2];
            
					}
				}
		
				else if(RxState==3)		
				{
						if(RxBuffer1[RxCounter1-1] == 0x5B)
						{
									USART_ITConfig(USART2,USART_IT_RXNE,DISABLE);
									if(RxFlag1)
									{
									
								 
                               //printf("Cx=%d\r,Cy=%d\r,Cw=%d\r,Ch=%d\r\n",Cx,Cy,Cw,Ch);
							   //printf("xerror=%d,   yerror=%d\r\n",80-Cx,60-Cy);
									}
  								
									RxFlag1 = 0;
									RxCounter1 = 0;
									RxState = 0;
									USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
						}
						else   
						{
									RxState = 0;
									RxCounter1=0;
									for(i=0;i<10;i++)
									{
											RxBuffer1[i]=0x00;      
									}
						}
				} 
	
				else   
				{
						RxState = 0;
						RxCounter1=0;
						for(i=0;i<10;i++)
						{
								RxBuffer1[i]=0x00;     
						}
				}

		}
	}

	

	

这是接受openmv端传回坐标的代码,此代码是借鉴网上其他博主写的代码,感兴趣的小伙伴也可搜索查阅。

(2)pid.c的代码

#include "pid.h"
//x轴舵机的pid运算
float Kp_x=2,     //2
	    Ki_x=0.15,  //0.15
      Kd_x=2;    //2
float www,zzz;
int pwm_xpid(int xerror)
{
	int pid_ActualPwm;
    static float pid_Integral,pid_Voltage,error_Last;//注意这里需要使用static关键字
	pid_Integral+=xerror;
	www=pid_Integral;
	if (pid_Integral<-6000) pid_Integral=-6000;//积分限幅
	if (pid_Integral>6000) pid_Integral=6000;//积分限幅
	pid_Voltage=Kp_x*xerror+Ki_x*pid_Integral+Kd_x*(xerror-error_Last);	
	error_Last=xerror;
	pid_ActualPwm=pid_Voltage*1;
	if (pid_ActualPwm<-1000) pid_ActualPwm=-1000;//pwm的范围是500到2500,这里要对pwm进行限幅
	if (pid_ActualPwm>1000) pid_ActualPwm=1000;
	return pid_ActualPwm;
}

//y轴舵机的pid运算
float Kp_y=1,     //1
	    Ki_y=0.15,  //0.15
      Kd_y=2;    //2

int pwm_ypid(int yerror)
{
	int pid_ActualPwm;
    static float pid_Integral,pid_Voltage,error_Last;//注意这里需要使用static关键字
	pid_Integral+=yerror;
    zzz=pid_Integral;
	if (pid_Integral<-6000) pid_Integral=-6000;//积分限幅
	if (pid_Integral>6000) pid_Integral=6000;//积分限幅
	pid_Voltage=Kp_y*yerror+Ki_y*pid_Integral+Kd_y*(yerror-error_Last);	
	error_Last=yerror;
	pid_ActualPwm=pid_Voltage*1;
	if (pid_ActualPwm<-1000) pid_ActualPwm=-1000;//pwm的范围是500到2500,这里要对pwm进行限幅
	if (pid_ActualPwm>1000) pid_ActualPwm=1000;
	return pid_ActualPwm;
}

(3)timer.c代码

#include "timer.h"
#include "led.h"
#include "pid.h"
#include "usart.h"

int pid_xerror,pid_yerror,xpwm,ypwm;
extern  int Cx,Cy;
void TIM3_Int_Init(u16 arr,u16 psc)
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);  
	
    TIM_TimeBaseInitStructure.TIM_Period = arr; 	
	TIM_TimeBaseInitStructure.TIM_Prescaler=psc;  
	TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; 
	TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; 
	
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
	
	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); 
	TIM_Cmd(TIM3,ENABLE); 
	
	NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; 
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; 
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03;
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	
}


void TIM3_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) 
	{
		if (Cx>0&&Cy>0)//Cx、Cy分别为红色物体中心点的横、纵坐标,当Cx、Cy都大于0时代表识别到红色物体
		{	pid_xerror=80-Cx;//80为画面中心点的横坐标,这行代码是计算红色物体中心点横坐标离画面中心点横坐标的偏差值
			pid_yerror=60-Cy;//60为画面中心点的纵坐标,这行代码是计算红色物体中心点纵坐标离画面中心点纵坐标的偏差值
			xpwm=pwm_xpid(pid_xerror);//通过pid计算得到x轴舵机运动的pwm值
			ypwm=pwm_ypid(pid_yerror);//通过pid计算得到y轴舵机运动的pwm值
			TIM_SetCompare1(TIM4,1500-xpwm);//1500对应x轴舵机转到90度,这行代码是让x轴舵机转到对应的角度
			TIM_SetCompare2(TIM4,1500-ypwm);//1500对应y轴舵机转到90度,这行代码是让y轴舵机转到对应的角度
		}
    else 
    {
      	TIM_SetCompare1(TIM4,1500-xpwm);//这两行代码是当没有识别到红色物体时,舵机在当前位置停下
	    TIM_SetCompare2(TIM4,1500-ypwm);
    }	
		
	}
	TIM_ClearITPendingBit(TIM3,TIM_IT_Update);  
}

(4)pwm.c代码

#include "pwm.h"
#include "led.h"
#include "usart.h"
 

void TIM4_PWM_Init(u32 arr,u32 psc)
{		 					 
	
	
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);  	   
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); 	
	
	GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_TIM4);
    GPIO_PinAFConfig(GPIOB,GPIO_PinSource7,GPIO_AF_TIM4); 

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;           
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;     
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;	
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;      
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;        
	GPIO_Init(GPIOB,&GPIO_InitStructure);              
	  
	TIM_TimeBaseStructure.TIM_Prescaler=psc; 
	TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; 
	TIM_TimeBaseStructure.TIM_Period=arr;   
	TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; 
	
	TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);
	
 
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; 
 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; 
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
	TIM_OC1Init(TIM4, &TIM_OCInitStructure); 
	TIM_OC2Init(TIM4, &TIM_OCInitStructure);  

	TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable); 
 	TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);  

    TIM_ARRPreloadConfig(TIM4,ENABLE);
	
	TIM_Cmd(TIM4, ENABLE);  
 
										  
}  


(5)main.c代码

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "timer.h"
#include "pwm.h"
#include "usart2.h"

//PA9----TX    PA10-----RX
extern float www,zzz;
extern int  xpwm;
extern int pid_xerror,pid_yerror,xpwm,ypwm;
extern void TIM4_PWM_Init(u32 arr,u32 psc);
int main(void)
{ 
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
	delay_init(168);  //初始化延时函数
	LED_Init();	      //初始化LED端口
	uart_init(9600);
	uart2_init(9600); //   openmv       stm32
	                  //    p4(TX)------A3(RX) 
	                  //    p5(RX)------A2(TX)
 	TIM3_Int_Init(100-1,8400-1);  //定时器3每10ms中断一次
	TIM4_PWM_Init(20000-1,84-1);  //舵机  20ms   0度---pwm50   90度---pwm150  180度-pwm250
    TIM_SetCompare1(TIM4,1500);//让x轴舵机转到90度
    TIM_SetCompare2(TIM4,1500);//让y轴舵机转到90度
	while(1)
	{
      //printf("xpwm=%d\r",xpwm);
	  //printf("ypwm=%d\r\n",ypwm);

	};
}

以上代码可直接复制到自己的工程中运行,openmv端识别的代码以及和32端通信的代码参考其他博主的代码,感兴趣的小伙伴可以自行搜索,欢迎大家在评论区评论,有什么问题可在评论区提问。

以下是完整的代码链接:

链接:https://pan.baidu.com/s/1Ijq4ViOlD4Ca8juhDBmQvw 
提取码:ojx1 
--来自百度网盘超级会员V4的分享

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

openmv识别红色物体并返回坐标给stm32单片机,通过pid控制舵机云台 的相关文章

  • 数据结构——栈(九)

    数据结构 文章目录 数据结构前言一 栈的介绍二 栈的实现1 栈的结构2 栈的初始化3 进栈4 出栈5 栈的判断6 取栈顶元素7 栈的清空8 栈的销毁 总结 前言 栈是一种特殊的线性表 xff0c 只允许在固定的一端进行插入和删除元素的操作
  • 数据结构——队列(十)

    数据结构 文章目录 数据结构一 什么是队列二 队列的实现1 队列的结构2 队列的初始化3 入队4 出队6 队头队尾的获取 总结 一 什么是队列 队列 xff1a 只允许在一端进行插入数据操作 xff0c 在另一端进行删除数据操作的特殊线性表
  • ESP8266通过MQTT协议连接onenet云平台

    中国移动onenet平台 文章目录 中国移动onenet平台前言一 onenet平台二 ESP82661 完整代码2 联网代码3 连云代码4 数据处理 总结 前言 最近在弄onenet平台 xff0c 用arduino结合esp8266 x
  • Arduino串口提取数字(整型和浮点型)

    数据提取 文章目录 数据提取前言一 提取整型数据二 提取浮点型数据 前言 之前需要用32和ESP进行通信上传数据 xff0c 一直都用的都是数据上传然后处理成整型数据 xff0c 今天需要处理成浮点型数据所以就查了一下 xff0c 于是就记
  • vins-fusion环境配置、安装与测试

    本文主要介绍如何搭建vins fusion的运行环境 xff0c 以及解决vins fusion编译运行时遇到的环境冲突问题 xff0c 并在此基础上实现例程的运行 目录 一 安装OpenCV 3 4 111 1 配置依赖环境1 2 下载O
  • JS和JQuery监听滚动条事件

    网上查了一下 xff0c 找到两种js监听滚轮事件的方法 xff08 1 xff09 window onscroll 61 function xff08 2 xff09 document addEventListener 34 onscro
  • STM32使用中断及串口通信

    1 中断模式编程控制LED 采用中断模式编程 xff0c 当开关接高电平时 xff0c LED亮灯 xff1b 接低电平时 xff0c LED灭灯 单片机除了基本的连线外 xff0c 我们另外只接一只LED灯 使用外部中断的基本步骤如下 x
  • 用opencv打开图片及视频

    用opencv打开图片及视频 1 opencv的安装 参考文章http t csdn cn QO7dr 2 用opencv打开图片 建立code文件夹存放代码 xff0c 然后打开文件夹创建test1 cpp文件 在test1 cpp文件里
  • 【Keil】 Keil的搭建并配置,并编写简单的汇编程序

    Keil的搭建并配置 一 配置环境1 MDK的安装1 1 MDK5下载1 2安装 2 安装stm32 pack 二 Mdk使用配置技巧1 设置tab键为2个空格2 代码自动补齐3 语法动态错误检测4 右边距指示 三 编写 一个简单的汇编程序
  • 【stm32CubeMX】STM32F103c8t6串口通信

    stm32CubeMX STM32F103c8t6串口通信发送 39 hello windows 39 一 串口通信协议1 UART协议2 RS 2323 RS 485 二 USB转TTL三 配置CubeMX并建立工程四 串口通信实现五 k
  • 【STM32】基于SPI的OLED显示屏与DHT20温湿度采集显示数据

    STM32 基于SPI总线的OLED显示屏与DHT20温湿度采集显示数据 一 SPI通讯协议二 关于0 96英寸OLED模块三 硬件连接四 示例代码五 代码修改与撰写六 屏幕歌词滚动1 滚屏设置2 代码撰写 七 展示八 DHT20温湿度采集
  • 【STM32CubeMX】使用STM32F103C8T6输出PWM波形实现呼吸灯

    STM32CubeMX 使用STM32F103C8T6输出PWM波形实现呼吸灯 一 关于PWM二 Cube MX创建工程三 修改代码四 效果展示五 总结六 参考与代码下载 一 关于PWM 1 关于PWM 含义 PWM xff08 Pulse
  • 【STM32】基于HAL库使用最小系统板移植uCOS

    STM32 基于HAL库使用最小系统板移植uCOS 一 CubeMX建立工程模板二 下载uC OS III源码三 移植准备四 开始移植1 将uCOS文件添加到项目2 为bsp c和bsp h添加代码3 修改main c文件代码4 修改其余文
  • Ubuntu20.04打不开终端

    Ubuntu20 04打不开终端 下载xterm输入gnome terminal显示 xff1a Error constructing proxy for org gnome Terminal org gnome Terminal Fact
  • 串口DMA发送接收

    目录 一 DMA的基本介绍 1 DMA定义 2 原理 1 请求 2 响应 3 传输 4 结束 3 传送方式 1 停止CPU访问内存 2 周期挪用 3 DMA与CPU交替访问内存 4 DMA中断 二 新建cubemx项目 1 选择STM32F
  • Time Limit Exceeded的原因

    Time Limit Exceeded的原因及避免方法 荷叶田田 CSDN博客
  • GStreamer学习三(延迟)

    1 延迟 延迟 xff08 即latency xff09 是在时间戳0处捕获的样本到达接收器所花费的时间 此时间是根据流水线的时钟测量的 对于只有包含与时钟同步的 接收器 元素的流水线 xff0c latency 始终为0 xff0c 因为
  • 第一届ACC全国高校联赛

    y 竞赛 AcWing 面向全国高校同学的高校联赛 https www acwing com activity content 1173 一 1 暴力 include lt bits stdc 43 43 h gt using namesp
  • JDBC连接数据库

    个人简介 x1f496 作者简介 xff1a 大家好 xff01 我是yukki 个人主页 xff1a yukki x1f4c2 喜欢 xff1a x1f308 点赞 x1f308 收藏 xff01 更新Java x1f308 python
  • idea 文件夹右键新建没有Class

    个人简介 作者简介 xff1a 大家好 xff01 我是yukki 个人主页 xff1a yukki 喜欢 xff1a x1f308 点赞 x1f308 收藏 x1f308 一键三连 xff01 共勉 一 问题发现 xff1a 没法创建ja

随机推荐

  • 《关于我找了好久的bug,却没找出来的,又不小心解决了的事》

    个人简介 作者简介 xff1a 大家好 xff01 我是yukki 个人主页 xff1a yukki 喜欢 xff1a x1f308 点赞 x1f308 收藏 x1f308 一键三连 xff01 共勉 问题 xff1a 这是一个Spring
  • 某某科技实习日志

    个人简介 作者简介 xff1a 大家好 xff01 我是yukki 个人主页 xff1a yukki 喜欢 xff1a x1f308 点赞 x1f308 收藏 x1f308 一键三连 xff01 共勉 时间 2023年 4月 11日 今日任
  • XXXX实习日志

    个人简介 作者简介 xff1a 大家好 xff01 我是yukki 个人主页 xff1a yukki 喜欢 xff1a x1f308 点赞 x1f308 收藏 x1f308 一键三连 xff01 共勉 时间 2023年 4月 12日 今日任
  • STM32——中断优先级分组

    一 SCB AIRCR寄存器 首先 xff0c 对STM32中断进行分组 xff0c 0 4 同时 xff0c 每个中断设置一个抢占优先级和一个响应优先级 1 高抢占可以打断正在执行的低抢占 2 抢占相等 xff0c 高响应不能打断低响应
  • Keil报错总结(1)

    一 newline expected extra characters found c323 头文件定义有问题 ifndef define endif 他们后面的文件名与文件名不一致 xff0c 或者大小写不一致 xff0c 文件名尽量避免
  • GPIO实验

    一 GPIO简介 GPIO xff08 General purpose input output xff09 即通用型输入输出 xff0c GPIO可以控制连接在其之上的引脚实现信号的输入和输出 芯片的引脚与外部设备相连 xff0c 从而实
  • Exynos_4412——中断处理(中断学习结尾篇)

    目录 一 ARM的异常处理机制 1 1异常概念 1 2异常处理机制 1 3ARM异常源 1 4异常模式 1 5ARM异常响应 1 6异常向量表 1 7异常返回 1 8IRQ异常举例 二 工程模板代码结构 三 中断处理框架搭建 四 中断处理程
  • ROS中控制小乌龟移动(2种方法)

    操作系统 xff1a Ubuntu16 04 ROS版本 xff1a Kinetic 目录 方法一 xff1a 用键盘控制小乌龟移动1 启动ROS Master2 打开小乌龟3 键盘控制小乌龟 方法二 xff1a 通过命令发布话题控制小乌龟
  • QT/C++——对话框

    一 标准对话框 include 34 widget h 34 include lt QVBoxLayout gt include lt QHBoxLayout gt Widget Widget QWidget parent QWidget
  • QT/C++——主窗口和事件处理

    一 主窗口 上面就是一个主窗口 xff0c 主窗口中的每一个都是Action 这次新建工程要选择mainwindow ifndef MAINWINDOW H define MAINWINDOW H include lt QMainWindo
  • QT/C++——网络编程

    目录 一 基础知识复习 二 UDP 客户端 xff1a 服务器 xff1a 三 TCP 服务器 xff1a 客户端 xff1a 四 小项目 客户端 xff1a 服务器 xff1a 一 基础知识复习 这部分内容前面讲的比较详细 xff0c 现
  • Linux驱动开发——高级I/O操作(一)

    一个设备除了能通过读写操作来收发数据或返回 保存数据 xff0c 还应该有很多其他的操作 比如一个串口设备还应该具备波特率获取和设置 帧格式获取和设置的操作 一个LED设备甚至不应该有读写操作 xff0c 而应该具备点灯和灭灯的操作 硬件设
  • ubuntu22.04安装与配置

    目录 一 环境及下载 iso下载 VM配置 二 虚拟机与环境配置 虚拟机开始后的配置 一些工具配置 参考 xff1a VMware Workstation Pro 文档 一 环境及下载 iso下载 Download Ubuntu Deskt
  • Linux——互斥与同步

    目录 一种典型的竞态 内核中的并发 中断屏蔽 原子变量 自旋锁 读写锁 顺序锁 一种典型的竞态 假设整型变量i是驱动代码中的一个个全局变量 xff0c 在驱动的某个例程中执行了i 43 43 操作 xff0c 而在中断服务程序中也执行了i
  • 基于max30102的物联网病房监测系统(传感驱动和数据处理)

    目录 一 实物展示 二 主体介绍 三 MAX30102的驱动 四 MAX30102的数据处理 奋斗一个星期 xff0c 每个引脚都是扒皮焊接然后再把皮包回去的 这几天吸的垃圾气体感觉要少活两年 一 实物展示 这次吸取上次教训 xff0c 把
  • 基于max30102的物联网病房监测系统(中断处理和主题逻辑)

    目录 五 中断处理 六 主体框架 对采集数据的初始化 核心功能的实现 烟雾 通信帧格式 wifi接收数据的处理 OLED显示 五 中断处理 void SysTick Handler void TimingDelay Decrement vo
  • 无人机4G数传方案(合宙cat1模块)

    一 合宙Cat1简介 YED C724 核心板是由银尔达 xff08 yinerda xff09 基于合宙 Air724 模组推出的低功耗 xff0c 超小体积 xff0c 高性能嵌入式 4G Cat1 核心版 xff0c 标准的 2 54
  • C++学习ros2话题机制(发布与订阅)

    C 43 43 学习ros2 一 创建文件和文件夹1 结构2 创建工作空间和工作包3 直接创建node cpp文件 二 编写节点文件 xff08 发布订阅 xff09 1 node1 cpp xff08 发布 xff09 2 CMakeLi
  • AttributeError: module ‘keras.backend’ has no attribute ‘set_image_dim_ordering’

    问题 原始代码如下 xff1a keras span class token punctuation span backend span class token punctuation span set image dim ordering
  • openmv识别红色物体并返回坐标给stm32单片机,通过pid控制舵机云台

    本人搜索了有关于舵机云台pid控制的代码 xff0c 但是都没有搜到想要的结果 xff0c 现在自己写出来了代码 xff0c 所以就将自己写的代码分享出来 xff0c 和大家一起学习进步 1 openmv识别红色物体 43 返回中心坐标的的