- 博客(29)
- 收藏
- 关注
原创 STM32--10硬件读写MPU6050
每隔100ms做一次取数显示,其实取数加显示应该是30ms左右,我试过10ms,结果是数不动了,有时候还全是0,这里不知道为什么,deepseek也不能说准,以后有设备再排查吧。读寄存器的流程是开始I2C通信,发送设备地址(写),发送寄存器地址,重新开始,发送设备地址(读),关闭应答,结束I2C通信,等待数据接收,后存入Data,打开应答。一定是先关应答,后读数,如果反过来,读完数了,再关应答,从机下一组数已经到了,主机却不想要了,会导致主机从机的状态机不一致,混乱。
2026-09-06 15:32:41
238
原创 STM32--10软件读写MPU6050,I2C的初次应用
接收字节时采用位或传输,初始时Byte=0000 0000,我们往Byte里填数,当SCL为1时,SDA为1我们就给它填进来,比如1010 0011,SDA会在第7,5,1,0位读到1,位或0000 0000 之后成功接收数据1010 0011。,在SCL为1的情况下,SDA置0就是起始条件,SDA置1就是终止条件,连续的起始终止会打乱状态机,导致通信失败,总之这里的程序执行逻辑是很刻板的。如果此时从机SDA置0,从机和负极之间可没有大电阻,就是直连,整个电路都会被带到从机的低电平上,即从机控制了电路,
2026-08-26 15:20:05
250
原创 STM32--9USART收发HEX数据包
手动清除中断挂起标志位,这里不写这行也行,因为USART_ReceiveData(USART1)会自动清除中断挂起标志位,这里写是给提个醒。pRxPacket:计数器,状态1时计数,到4之后转到状态2.在发送时通过帧头0XFF和帧尾0XFE把数据包裹起来发送。接收时通过中断响应接收,一个字节触发一次中断。RxState:状态机的状态,有0,1,2。
2026-08-19 20:07:16
256
原创 STM32--8USART串口发送和接收
参数和格式匹配放入字符串。第一次i=0,123/10的3次方再对10求余,再加上字符常量'0','0'的asc码值是48,所以结果就是0。第一次i=1,123/10的2次方再对10求余,再加上字符常量'0','1'的asc码值是49,所以结果就是1。第一次i=2,123/10的1次方再对10求余,再加上字符常量'0','2'的asc码值是50,所以结果就是2。第一次i=3,123/10的0次方再对10求余,再加上字符常量'0','3'的asc码值是51,所以结果就是3。发送字符串时遇到'\0'空字符停止,
2026-08-17 16:23:01
180
原创 STM32--8DMA,ADC联用接收传感器信号
传输方向,外设为源,即外设向内存传输数据。单次传输模式,这里是传输4个通道就截止。DMA_M2M_Disable,非内存传内容,即外设内存互传。DMA_Priority_Medium,中等传输优先级。DMA_BufferSize=4,通道数为4。
2026-08-13 15:17:47
222
原创 STM32--7ADC模数转换
ADC转换结果右对齐,因为ADC转换结果是12位的,但寄存器是16位的,所以就有一个在寄存器中靠左存,还是靠右存的问题,一般我们选靠右低位存,这样结果可以直接拿来用。单次模式,拧一下电位器读一次电压。在需要读连续的信号或信号变化很快时才用连续模式。扫描模式不开启,因为这里只用了a0一个通道,当使用多个通道时需要开启扫描模式。单ADC模式,因为还有个双ADC模式,但比较复杂。设置新的校准因子,等完全设置好了再进行下一项。清除校准因子,等到彻底清除再进行下一项。实际使用通道数为1,这里只用了pa0.
2026-08-11 15:35:13
227
原创 STM32--6PWM测定频率和占空比
在一个时钟周期内,若采用pwm1模式,则是cnt<=ccr,输出高电平,反之输出低电平,所以用ccr/arr(自动重装即period)算出的占空比。开漏输出是只有一个n-mos管接负极,如果n-mos管导通,输出就是0v,如果n-mos截止,那输出就是高阻态,所谓高阻态就是输出悬空,可能是0,可能是1,也能0.1跳变,不确定。因为输出比较模块是在TIM模块配置内的,换句话说,RCC_APB1Periph_TIM2是配置定时器的时钟,定时器时钟开启,他的时基单元和输出比较功能就能正常运行。
2026-08-05 16:54:59
193
原创 STM32--5 PWM控制呼吸灯
占空比 = TIM_Pulse / (TIM_Period + 1) × 100%,意思是初始占空比是0,即小灯灭。普通推挽输出由软件控制,比如用Resetbits,Setbits这种函数控制高低电平。GPIO_Mode_AF_PP:复用推挽输出。输出模式为PWM1,高电平有效,打开输出通道。复用推挽输出这里用的定时器外设控制。这两行都是高级定时器配置,不用管他。
2026-07-31 16:54:44
209
原创 STM32--4定时器定时中断
原来频率为72MHz,分频成7200块,分频之后频率10000,意思是一秒计数10000次,到达10000此后计数器溢出,发出中断,在中断函数中将Num+1,完成计数。写上这句之后,中断标志位被清零,才能实现从0计数。TIM_CounterMode,计数器计数方向,TIM_CounterMode_Up从零开始向上计数达到TIM_Period之后重置为0重新计数。TIM_RepetitionCounter,重复计数器,多用于高级定时器控制中断或触发DMA,普通定时器我们直接设置0,不生效。
2026-07-27 17:33:10
175
原创 STM32--2按键控制小灯亮灭
因为我们采取GPIO_Mode_IPU的上拉输入,即芯片内有一个高电平,如果B1引脚为低电平,则电路接通,此时我们把KeyNum=1,记录按键按下,电路接通的状态。用下拉也可以,但上拉输入 抗干扰能力强,因为另一端直接接GND,噪声最小,而且布线方便,GND实际更容易接,实际应用绝大多数时候用上拉输入。再main函数中,将按键和小灯的功能集合起来,按下B1引脚的按键,KeyNum=1,然后小灯亮。不用的话,引脚就会悬空,读到电平可能是0,可能是1,也可能来回跳变,会不稳定。为什么用上拉输入,不用行不行?
2026-07-24 13:37:21
209
原创 STM32--1流水灯
APB2是高速总线,最高72MHz,常挂载GPIOA~G、USART1、SPI1、TIM1、ADC1/2/3、所有AFIO功能,72MHz是一秒内晶体产生的方波信号,1秒内高低电平交替变化。//设置时钟源为HCLK,启动定时器。GPIO_Write直接写GPIOA的引脚,因为他有16个引脚,所以有16个二进制位,0x是十六进制。0X0002是0000 0000 0000 0002,意思是点亮A2处的小灯,后面以此类推。GPIO_Mode_Out_PP,推挽输出,用两个MOS管来实现强驱动,
2026-07-22 15:02:02
186
原创 pytorch17->一张实际图片的识别实战
==================== 2. 加载模型(直接用完整模型) ====================# ==================== 4. 预处理图片 ====================# ==================== 3. 加载图片 ====================# ==================== 6. 输出结果 ====================print(f"✅ 图片加载成功,原始尺寸: {image.size}")
2026-06-26 18:36:47
232
原创 pytorch16->完整模型运行实例
(outputs.argmax(1) == targets).sum(),如果算出某类结果和目标一致,代表预测正确,反之,预测错误。outputs有64张图片,10种图片类型的得分,argmax(1)是算第一维的最大参数,也就是输出10种图片类型得分的最高值,从而判断它是哪种图片。tudui.train(),模型切换到训练模式这题的tudui.train(),和tudui.eval()只是起到标志作用。print(f"-------- 第 {epoch+1} 轮训练开始 --------")
2026-06-26 17:18:17
236
原创 pytorch15->vgg16的修改,保存,加载
==================== 2. 修改模型 (适配 CIFAR-10) ====================# ==================== 3. 模型保存 (P26) ====================# ==================== 4. 模型加载 (P26) ====================# ==================== 1. 加载预训练模型 ====================
2026-06-25 18:53:16
244
原创 pytorch14->optim优化器的简单应用
一个3通道5*5的卷积核有75个参数,卷积核轮流扫描这张图片的像素,卷积核发现像素的规律,有的地方亮,参数值大,有的地方暗,参数值小,几轮卷积池化下来,神经网络能看出这些数字背后的秘密,在人类看来它们可能是一种边缘,一种线条,一种形状,神经网络眼中,他们就是一堆有规律的数字,下一次他又发现这种数字了,他认为这个和之前他见过的‘猫’很像,这样来识别物体。tudui.parameters():获取参数在优化器中修改,只能修改卷积核和全连接层的权重和偏置,flatten和maxpool没有权重和偏置,因为它们。
2026-06-25 16:04:08
220
原创 pytorch13->loss损失函数的简单应用
1. 定义输入和目标(注意:需要 float32 类型)# 2. reshape 成四维(batch, channel, height, width)# 3. L1Loss(平均绝对误差,默认 reduction='mean')# 5. MSELoss(均方误差)# 6. CrossEntropyLoss(交叉熵,常用于分类)y = torch.tensor([1]) # 真实类别索引为 1。
2026-06-24 18:39:51
22
原创 pytorch12->Sequential的简单应用
假设原图是32*32,卷积核是5*5,原来总共就是0~31行,如果不填充,卷积核只能在2~29行取到数,上下左右边缘的2行都被损失掉了,如果补上两行,padding=2的话,卷积核才能取到原来的32*32。# │ └──────────── 第2个参数:out_channels(输出通道数)# └──────────────── 第1个参数:in_channels(输入通道数)print("完成!
2026-06-24 16:13:48
505
原创 pytorch11->线性层linear的简单应用
output = torch.flatten(imgs, start_dim=1) ,从第1维开始展平,把1,2,3维的3,32,32乘到一起成为[64, 3072],再通过tudui网络输出,3072输入进去,10输出来。print(f"flatten 后: {output.shape}") # [64, 3072]print(f"输入形状: {imgs.shape}") # [64, 3, 32, 32]print(f"输入形状: {imgs.shape}") # [64, 3, 32, 32]
2026-06-21 16:37:22
207
原创 pytorch10->非线性激活sigmoid函数简单应用
运行 tensorboard --logdir=logs_sigmoid 查看效果")1.sigmoid函数:把所有实数收敛到0~1,负数越大越接近零,0收敛到0.5,正数越大越接近一。torchvision负责视觉图片方面,主要是数据集准备和常见的数据预处理张量化。再定义一个神经网络土堆,一般这里边会有很多操作,这题只有一个sigmoid操作,4.这道题的思路是,先准备一个cifar10数据集,给他张量化,# 记录经过 Sigmoid 处理后的图片。# 2. 定义网络 (仅包含 Sigmoid)
2026-06-21 15:14:22
205
原创 pytorch9->maxpool2d的简单应用
关于灰度图,他只有一维,从0到255,只有黑白灰,所以叫灰度图,如果是RGB的三通道那你可以得到人眼一样的色彩,鸟是4通道,他们甚至能看到紫外线。同学,你眼里还有光吗。这句话很有意思,self是Tudui类的对象,maxpool1是self的属性,self.maxpool1是Maxpool2类的对象,那么不难看出,只有第一次取到完整9个数,如果你是ceil_mode=True,你能得到2,3,5,1。如果你是ceil_mode=False,即取不全的,就破罐子破摔,不要了,那你能得到的只有一个2。
2026-06-16 19:32:52
185
原创 pytorch8->conv2d卷积的简单应用
'./data',return xstep=0step+=1if step>5:breakprint('完成')Conv2d是的缩写,是。
2026-06-16 15:40:01
1024
原创 pytorch7->nn.module的简单演示
2. super().__init__()继承父类nn.module。为什么已经导入torch了,还要import nn?神经网络的数据输入采用张量格式。nn.module有什么用?参数移动到 GPU 的过程。etwork(神经网络)nn.module是。训练/评估模式的切换。
2026-06-15 14:45:15
165
原创 pytorch6->dataloader的简单应用
test_loader:有10000张图,在dataloader中用 batch_size=64,每64个图片分成了一组,而且标上了序号一共157组。imgs, targets = data,imgs里有64张图片,如果你看imgs.shape,它是四维的[64,3,32,32],dataset=test_data,dataset只是个参数名,和路径没关系,不写也可以,比如第一行只写个test_data,shuffle=True,打乱顺序,每轮训练前打乱数据顺序,防止模型记住顺序,让模型学得更好。
2026-06-15 14:02:08
155
原创 pytorch5->datasets.CIFAR10简单例题
classes是列表,CIFAR10出生时自带,可以将label转化成name,比如label=1时,train_set.classes[label]是飞机.train_set[0],train_set对象正常不能[0],由于train_set[0]等价于train_set.train =True,(True,表示训练集,false,表示测试集)测试集:10,000张图片,每个类别有1,000张,用于评估模型效果。训练集:50,000张图片,每个类别有5,000张,用于训练模型。datasets,模块。
2026-06-12 13:44:07
333
原创 pytorch4->tensorboard的add_image函数简单应用
1.numpy:Numerical Python(数值计算库)它是 Python 里处理数组和矩阵的核心库。图片路径可以是相对路径,也可以是绝对路径,建议使用相对路径,项目复制到别人电脑也能用根据路径打开图片,赋给img_PIL。image_path是字符串,img_PIL是图片,有像素把 PIL 图片对象转成 NumPy 数组(像素数字矩阵),因为tensorboard不接受PIL,只接受NumPy 数组这种数字矩阵把图片放到tensorboard上。
2026-06-12 12:05:53
152
原创 pytorch3->tensorboard的add_scalar函数基础应用
实例化SummaryWriter类的对象writer,将TensorBoard 的动作存入文件’logs‘SummaryWriter:类,负责把数据写进日志文件,供tensorboard使用。add_scalar:挨个描点,启动TensorBoard 后渲染成线。关闭writer对象,如果不关闭,程序中途崩溃,缓存里的数据可能丢失。tensorboard:模块,张量板,让训练过程显示在浏览器上。scalar:标量,有别于向量,它是无方向的量。utils:PyTorch 实用工具包。从0到99取100个数。
2026-06-11 19:31:11
272
原创 pytorch2->transforms简单应用
本文展示了使用PyTorch的transforms模块进行图像预处理,并通过TensorBoard可视化处理结果。主要内容包括:1) 使用ToTensor将PIL图像转换为张量并归一化到[0,1]范围;2) 使用Normalize进行标准化处理;3) 通过Resize调整图像尺寸(固定尺寸和比例缩放两种方式);4) 使用Compose组合多个变换操作;5) 用RandomCrop实现随机裁剪增强数据。所有处理结果都通过SummaryWriter写入TensorBoard日志,方便可视化比较不同处理效果。关键
2026-06-09 20:03:43
178
原创 pytorch1->dataset简单例题理解
PIL:Python Imaging Library(Python 图像处理库),Image:图片处理模块。torch:库,utils:实用工具包,data:模块,Dataset:数据集类(身份证,实际用处不大)从self.image_paths列表中索引拿到图片,打开并返回一个图片对象。print(f'一共有{len(dataset)}张图片')os,模块,path路径子模块,join连接路径函数。print(f'第一张图片:{img}')打开文件夹,返回子文件名的列表。self的作用:指代类的实例。
2026-06-09 14:24:42
439
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅