一转四USB转TTL模块
经常会遇到USB转TTL模块不够用的情况,因此这次直接搞一个一转四的USB转TTL模块,这下总够用了吧; 原理图 设计原理图 PCB PCB图 PCB仿真图(正面) PCB仿真图(反面) 在线BOM BOM 实物图 实物图(正面) 实物图(反面) 四个COM口!!!!
经常会遇到USB转TTL模块不够用的情况,因此这次直接搞一个一转四的USB转TTL模块,这下总够用了吧; 原理图 设计原理图 PCB PCB图 PCB仿真图(正面) PCB仿真图(反面) 在线BOM BOM 实物图 实物图(正面) 实物图(反面) 四个COM口!!!!
当需要同时读取多个点的温度数据时,DS18B20就是一个很好的选择,不仅精度高,而且还可以单总线挂载多个传感器以节省IO口的使用; 初始化函数 DS18B20的通信协议为单总线通信协议; 首先由主机发送一个复位脉冲约480-960us;然后总线被拉高;在15-60us之后传感器向单片机发送一个约60-240us的存在脉冲,然后总线被拉高。 /** * @brief 主机给从机发送复位脉冲 */ static void DS18B20_Reset(void) { DS18B20_Mode_OUT_PP(); // 主机输出 DS18B20_OUT_0; // 主机至少产生 480us 的低电平复位信号 delay_us(750); DS18B20_OUT_1; // 主机在产生复位信号后,需将总线拉高 // 从机接收到主机的复位信号后,会在 15 ~ 60 us 后给主机发一个存在脉冲 delay_us(15); } /** * @brief 检测从机给主机返回的存在脉冲 * @return 0:成功 1:失败 */ static uint8_t DS18B20_Presence(void) { uint8_t pulse_time = 0; DS18B20_Mode_IN_NP(); // 主机设为输入 // 等待存在脉冲的到来,存在脉冲为一个 60 ~ 240 us 的低电平信号 // 如果存在脉冲没有来则做超时处理,从机接收到主机的复位信号后,会在 15 ~ 60 us 后给主机发一个存在脉冲 while (DS18B20_IN && (pulse_time = 100) { return 1; } else { pulse_time = 0; } // 响应脉冲(低电平)到来,且存在的时间不能超过 240 us while (!(DS18B20_IN) && pulse_time = 240) { return 1; } else { return 0; } } /** * @brief DS18B20 初始化函数 * @reurn 0:成功 1:失败 */ uint8_t DS18B20_Init(void) { DS18B20_Mode_OUT_PP(); DS18B20_OUT_1; DS18B20_Reset(); return DS18B20_Presence(); } 配置写函数 当主机将数据线从高逻辑级别拉到低逻辑级别时,将启动写入时隙。有两种类型的写时槽:写1时槽和写0时槽。所有写入时隙的持续时间必须至少为60µs,且每个写入周期之间的恢复时间至少为1µs以上。在DQ线下降后,DS18B20在15µs到60µs的窗口中对DQ线进行采样。 ...
尽量用较少的IO口来驱动较多的LED灯; 当IO口数量较少,而又需要驱动较多的LED灯时,就需要想办法通过修改硬件或者软件的方案来进行; 硬件方案的话,就是用串转并芯片例如74HC595或者其他的数码管驱动芯片来控制,当然会增加硬件成本,如果只是用在个人项目中,小小的成本增加并没有什么,但是如果是用在量产项目中,小小的成本增加就会吃掉一大部分盈利; 所以尽量还是使用软件方案,并不需要什么74HC595芯片; 下面介绍的这种方法叫做查理复用: 查理复用(Charlieplex)是一种在驱动大量LED时有效地节约IO口的方法,理论上可以用N个IO驱动N*(N-1)个LED,也有接入二极管用来做按键检测的,理论上可实现用N个IO驱动N*(N-1)个按键; 因而7个脚用满理论上可管理是42个LED,极大节省了IO口的使用; 但是对单片机的IO口有一个要求,也就是这种LED是由单片机I/O口直接驱动,I/O口要在工作在3态(高、低电平和高阻); 使用六个IO口驱动30个LED的原理图如下(第六行并未完整画出): 可以在程序里面每次间隔1ms,扫描一行,总共扫描6行后(6ms),一帧完整就画面结束了,也是利用人眼的视觉暂留画面; 一定要记得,每行扫描的时候,需要亮灯的高低电平点亮,不亮灯的IO口一定要设为悬浮(高阻模式)。
用单个IO口来检测两个按键的状态; 一、ADC方案 上面是原理图,这个方案很好理解,主要就是利用电阻分压原理来判断多个按键被按下的状态,如果ADC的位数足够多,可以判断的按键数也会很多; 因为原理很简单,在这里就不再多说; 二、非ADC方案 这个方案适用于无ADC引脚或者ADC引脚被其他外设占用的情况,只以单IO口检测两个按键的状态的方案为例; 原理图如下所示: EN是单片机内部的上拉使能开关,S1和S2是待检测的按键; 通过查阅STM32F103C8T6数据手册可以得知: 内部的上拉电阻阻值等效为40K欧姆电阻,高低电平的范围也在数据手册中有给出: 当MCU供电为3.3V时候: IO口低电平电压范围:-0.5-0.8V; IO口高电平电压范围: 2.0-3.8V; 因此得到最开始的检测电路;但有两个注意事项: 这里特别要注意在使用该电路时,电路参数须满足MCU的IO口高低电平的电气特性要求; 电路如果需要具备两个按键同时按的功能要求,需自行调整电路,该电路参数不满足该要求; 电路分析如下: 当EN 闭合时: S1 按下时, V_IO 接近0V,此时IO口为低电平。 S2 按下时, V_IO = 3.3V * R103 / (R+R103) V_IO = 3.3V * 510K/ (510K+(40K//2M)) = 3.06V 此时IO口为高电平。 当EN 断开时: S1 按下时, V_IO 接近0V,此时IO口为低电平。 S2 按下时, V_IO = 3.3V * R103 / (R+R103) V_IO = 3.3V * 510K/ (510K+ 2M) = 0.67V 此时IO口为低电平。 ...
图片PNG文件转JPG文件; 使用方法:将该脚本放置于png文件所在的文件夹中,然后运行该脚本,即可将png文件转化为jpg文件,并放置于JPG文件夹下; import os from PIL import Image dirname_read = "./" # 源文件文件夹 dirname_write = "./JPG/" # 目标文件文件夹 names = os.listdir(dirname_read) count = 0 for name in names: portion = os.path.splitext(name) # 分离文件名和扩展名 if portion[1] == ".png": # 判断扩展名是否为png img = Image.open(dirname_read+name) # 打开该文件 name = portion[0] + ".jpg" # 重命名文件 to_save_path = dirname_write + name # 设置保存路径 img = img.convert('RGB') # RGBA意思是红色,绿色,蓝色,Alpha指透明度。而JPG不支持透明度,所以要么丢弃Alpha,要么保存为.png文件 img.save(to_save_path, quality=95) # 保存 count += 1 # 计数加一 print(to_save_path, "------conut:", count) # 输出信息 else: continue print("Count_Sum:", count) # 输出总数
Jlink RTT调试技巧; 使用Jlink的 RTT功能 : 这个功能是不需要另外接其他引脚的,如果使用SW连接方式,仅仅两根线就可以。 RTT 是Jlink的一种实时终端的方式连接输出调试信息,网上有很多说明之间按照做就可以,我仅仅是记录一下自己的步骤. 就是下载RTT软件包,下载RTT文件: http://download.segger.com/J-Link/RTT/RTT_Implementation_140925.zip ; 添加RTT文件到自己的工程: 添加必要的头文件: 输出函数打印: 这个时候RTT在程序中就添加成功了,我们可以使用使用Jlink带的工具进行查看数据; 如打开RTT Viewer 提升连接,点击OK 不出意外的话,你就可以看到调试信息了;
LCD 显示太空人动画; 这个比较简单,就是把连续的画面播放起来就行;
自制Jlink-ob(带串口);
最近接了一个项目,是做一个绕线机,一般用来绕变压器线圈,已经基本做好了,原理并不难,就是根据你输入的一些参数,比如漆包线的直径以及每一层的圈数还有就是一共要绕多少圈,然后由控制器控制步进电机根据光电传感器的信号来回运动,已达到均匀绕线的目的。 其实这个项目拖了很长时间,因为自己拖延症太严重,而且中间又发生了很多事情,导致项目中间耽搁了很久,还好甲方没有在意,也没有太催我,上周终于下定决心要结束了这个项目,于是就用了一个下午还有晚上的时间完成了这个项目,因为手头没有合适的漆包线,于是就用了直径较细的焊锡丝代替,经过测试效果很好,因为步进电机的转动是通过细分的,所以可以做到很精细的控制,经过测试,精度可以达到0.0035mm,而甲方的要求是0.01mm,也算是完全符合要求了,于是我就把测试视频发给了甲方,甲方首先给予了肯定(那是必然呀,哈哈哈哈),然后给我发了一个红包,我一个疑惑,然后他就提出了一个新的需求,就是希望能够做到反转退线的功能,并且这种情况下能做到减计数。 我思考了一下,觉得是可以做到的,用一个光电传感器是可以判断转动的次数,那用两个光电传感器就可以判断次数和转动方向,原理是根据两个光电传感器被遮挡的先后来判断转动方向,例如光电1先被遮挡,然后光电2又被遮挡,则认为是正转,反之则认为是反转,理论可行,就差一个实践了,于是就修改了一下硬件(因为第一版硬件只留出了一个光电接口,而且少画了一个二极管),又发去打了一次板,板子还没到,所以也还没开始验证,应该是可以的,所以就等之后板子到了再验证下。 板子已经到了,经过验证,完全没问题,算是满足了甲方所有的要求,很开心,也收到了剩下的款项,基本这个项目是告一段落了; 下边是关于这个算法的程序: void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { uint32_t i = 0; if (GPIO_Pin == guangdian_Pin) { i = 65535; while (i--) ; i = 6553; while (i--) ; if (HAL_GPIO_ReadPin(guangdian_GPIO_Port, guangdian_Pin) == 0) { if (flag_stop == 0) { if (cnt_sum == 0) { flag_dir = N0; } if (cnt_sum % N2 == 0) { flag_dir = !flag_dir; } if (time_k1_temp
OLED 局部刷新提高帧率. 待续