光电传感器判断转动方向

​ 最近接了一个项目,是做一个绕线机,一般用来绕变压器线圈,已经基本做好了,原理并不难,就是根据你输入的一些参数,比如漆包线的直径以及每一层的圈数还有就是一共要绕多少圈,然后由控制器控制步进电机根据光电传感器的信号来回运动,已达到均匀绕线的目的。 其实这个项目拖了很长时间,因为自己拖延症太严重,而且中间又发生了很多事情,导致项目中间耽搁了很久,还好甲方没有在意,也没有太催我,上周终于下定决心要结束了这个项目,于是就用了一个下午还有晚上的时间完成了这个项目,因为手头没有合适的漆包线,于是就用了直径较细的焊锡丝代替,经过测试效果很好,因为步进电机的转动是通过细分的,所以可以做到很精细的控制,经过测试,精度可以达到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

December 22, 2021 · 1 min · Rancho

Windows使用技巧

Windows 使用技巧; 应用程序自启动 1、在Windows10桌面,右键点击桌面左下角的开始按钮,在弹出的菜单中选择”运行”菜单项. 2、这时就会打开Windows10的运行窗口,在窗口中输入命令shell:startup,然后点击确定按钮. 3、这时就可以打开Windows10系统的启动文件夹. 4、把需要开机启动的应用或是程序的快捷方式拖动到该文件夹中,这样以后电脑开机的时候,就会自动启动这些应用. 添加右键新建Markdown文档 1、在电脑桌面右键一个.txt文本(文档名随便,文档内容如下); Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\.md] @="MarkdownFile" "PerceivedType"="text" "Content Type"="text/plain" [HKEY_CLASSES_ROOT\.md\ShellNew] [HKEY_CLASSES_ROOT\MarkdownFile] @="Markdown File" [HKEY_CLASSES_ROOT\MarkdownFile\DefaultIcon] @="%SystemRoot%\system32\imageres.dll,-102" [HKEY_CLASSES_ROOT\MarkdownFile\shell] [HKEY_CLASSES_ROOT\MarkdownFile\shell\open] 2、修改文档的后缀为.reg; 3、双击打开这个.reg文档; 4、点击确定写进注册表; 5、在桌面右键刷新,然后新建就看到有markdown啦; 取消右键新建文件(以visio文件为例) 1、WIN+R; 2、输入regedit,enter确认,打开注册表编辑器; 3、在第一项HKEY_CLASSES_ROOT中找到对应的后缀名(例如.vsdx); 4、删去该项的子项->ShellNew; 5、再次右键新建文件即可发现已经修改成功;

October 2, 2021 · 1 min · Rancho

Arduino

最近做项目用到了Arduino的板子,在此记录一下开发过程中遇到的一些问题,其实我之前是很不情愿用Arduino,觉得底层都被封装起来了,而且那个IDE用起来真的是一言难尽。不过最近客户要求用Arduino进行开发,就硬着头皮上了,结果发现用VScode+Platformio开发Arduino还是顶好用的,而且有太多可以用的封装好的函数了,真香! 一个IO引脚驱动两个不同颜色的LED 用一个IO引脚驱动两个led灯 这个电路可以实现,一个IO引脚驱动两个不同颜色的LED,不过自己只测试过红色和绿色的LED,其他颜色的并没有验证,因为似乎红色和绿色对电压的要求较低。

October 2, 2021 · 1 min · Rancho

stc单片机使用技巧

最近做项目经常用到STC的单片机,在使用过程中遇到了较多的问题,而且在后续的硬件搭建过程中也积累了不少的经验,因此打算记录一下,方便以后的查询。

September 30, 2021 · 1 min · Rancho

蜂鸣器驱动电路

最近做项目用到了51单片机驱动蜂鸣器,但是一直无法驱动,后来以为是上拉电阻问题,结果发现加了上拉电阻会一直响,即使IO口输出为低电平。 ​ 后来发现还需要加一个下拉电阻以保证不受干扰。 参考:https://blog.csdn.net/qq_25814297/article/details/118696321?spm=1001.2014.3001.5506 下面就 3.3V NPN 三极管驱动有源蜂鸣器设计,从实际产品中分析电路设计存在的问题,提出电路的改进方案,使读者能从小小的蜂鸣器电路中学会分析和改进电路的方法,从而设计出更优秀的产品,达到抛砖引玉的效果。 常见错误接法 图1 为典型的错误接法,当 BUZZER 端输入高电平时蜂鸣器不响或响声太小。当 I/O 口为高电平时,基极电压为 3.3/4.7*3.3V≈2.3V,由于三极管的压降 0.6~0.7V,则三极管射 极电压为 2.3-0.7=1.6V,驱动电压太低导致蜂鸣器无法驱动或者响声很小。 图2 错误接法2 图2 为第二种典型的错误接法,由于上拉电阻R2,BUZZER 端在输出低电平时,由于 电阻R1和R2的分压作用,三极管不能可靠关断。 图3 为第三种错误接法,三极管的高电平门槛电压就只有 0.7V,即在 BUZZER 端输入 压只要超过0.7V就有可能使三极管导通,显然0.7V的门槛电压对于数字电路来说太低了, 电磁干扰的环境下,很容易造成蜂鸣器鸣叫。 图 4 为第四种错误接法,当CPU的GPIO管脚存在内部下拉时,由于 I/O 口存在输入阻抗,也可能导致三极管不能可靠关断,而且和图3一样BUZZER端输入电压只要超过0.7V就有可能使三极管导通。 以上几种用法我觉得也不能说是完全不行,对于器件的各种参数要求会比较局限,不利于器件选型,抗干扰性能也比较差。 NPN 三极管控制有源蜂鸣器常规设计 图 5 为通用有源蜂鸣器的驱动电路。电阻R1为限流电阻,防止流过基极电流过大损坏三极管。电阻R2有着重要的作用,第一个作用:R2 相当于基极的下拉电阻。如果A端被悬空则由于R2的存在能够使三极管保持在可靠的关断状态,如果删除R2则当BUZZER输入端悬空时则易受到干扰而可能导致三极管状态发生意外翻转或进入不期望的放大状态,造成蜂鸣器意外发声。第二个作用:R2可提升高电平的门槛电压。如果删除R2,则三极管的高电平门槛电压就只有0.7V,即A端输入电压只要超过0.7V 就有可能导通,添加R2的情况就不同了,当从A端输入电压达到约2.2V 时三极管才会饱和导通,具体计算过程如下: 假定β =120为晶体管参数的最小值,蜂鸣器导通电流是15mA。那么集电极电流IC=15mA。则三极管刚刚达到饱和导通时的基极电流是 IB=15mA/120=0.125mA。流经R2的电流是0.7V/3.3kΩ=0.212mA,流经R1的电流 IR1=0.212mA +0.125mA=0.337 mA。最后算出BUZZER端的门槛电压是0.7V+0.337mA× 4.7kΩ=2.2839V≈2.3V。 图中的C2为电源滤波电容,滤除电源高频杂波。C1可以在有强干扰环境下,有效的滤除干扰信号,避免蜂鸣器变音和意外发声,在 RFID射频通讯、Mifare卡的应用时,这里初步选用0.1uF 的电容,具体可以根据实际情况选择。 改进方案 蜂鸣器竟然有EMI 辐射?!在 NPN 3.3V 控制有源蜂鸣器时,在电路的 BUZZER 输入 高电平,让蜂鸣器鸣叫,检测蜂鸣器输入管脚(NPN 三极管的C极处信号,发现蜂鸣器在发声时,向外发生1.87KHz,-2.91V 的脉冲信号,如图 6 所示。 ...

September 30, 2021 · 1 min · Rancho

GCC学习记录

GCC常用命令; 1. 什么是gcc gcc的全称是GNU Compiler Collection,它是一个能够编译多种语言的编译器。最开始gcc是作为C语言的编译器(GNU C Compiler),现在除了c语言,还支持C++、java、Pascal等语言。gcc支持多种硬件平台。 2. gcc的特点 gcc是一个可移植的编译器,支持多种硬件平台。例如ARM、X86等等。 gcc不仅是个本地编译器,它还能跨平台交叉编译。所谓的本地编译器,是指编译出来的程序只能够在本地环境进行运行。而gcc编译出来的程序能够在其他平台进行运行。例如嵌入式程序可在x86上编译,然后在arm上运行。 gcc有多种语言前端,用于解析不同的语言。 gcc是按模块化设计的,可以加入新语言和新CPU架构的支持。 gcc是自由软件。任何人都可以使用或更改这个软件。 3. gcc编译程序的过程 gcc编译程序主要经过四个过程: 预处理(Pre-Processing) 编译 (Compiling) 汇编 (Assembling) 链接 (Linking) 预处理实际上是将头文件、宏进行展开。编译阶段,gcc调用不同语言的编译器,例如c语言调用编译器ccl。gcc实际上是个工具链,在编译程序的过程中调用不同的工具。汇编阶段,gcc调用汇编器进行汇编。链接过程会将程序所需要的目标文件进行链接成可执行文件。汇编器生成的是可重定位的目标文件,学过操作系统,我们知道,在源程序中地址是从0开始的,这是一个相对地址,而程序真正在内存中运行时的地址肯定不是从0开始的,而且在编写源代码的时候也不能知道程序的绝对地址,所以重定位能够将源代码的代码、变量等定位为内存具体地址。下面以一张图来表示这个过程,注意过程中文件的后缀变化,编译选项和这些后缀有关。 这是GCC编译的四个步骤。 4. gcc常用选项 来看一下gcc常用选项 选项名 作用 -o 产生目标(.i、.s、.o、可执行文件等) -E 只运行C预编译器 -S 告诉编译器产生汇编程序文件后停止编译,产生的汇编语言文件拓展名为.s -c 通知gcc取消连接步骤,即编译源码,并在最后生成目标文件 -Wall 使gcc对源文件的代码有问题的地方发出警告 -Idir 将dir目录加入搜索头文件的目录路径 -Ldir 将dir目录加入搜索库的目录路径 -llib 连接lib库 -g 在目标文件中嵌入调试信息,以便gdb之类的调试程序调试 现在我们有源文件hello.c,下面是一些gcc的使用示例: gcc -E hello.c -o hello.i 对hello.c文件进行预处理,生成了hello.i 文件 gcc -S hello.i -o hello.s 对预处理文件进行编译,生成了汇编文件 gcc -c hello.s -o hello.o 对汇编文件进行编译,生成了目标文件 gcc hello.o -o hello 对目标文件进行链接,生成可执行文件 gcc hello.c -o hello 直接编译链接成可执行目标文件 gcc -c hello.c 或 gcc -c hello.c -o hello.o 编译生成可重定位目标文件 使用gcc时可以加上-Wall选项。下面这个例子如果不加上-Wall选项,编译器不会报出任何错误或警告,但是程序的结果却不是预期的: ...

September 2, 2021 · 2 min · Rancho

VSCode格式化美化代码

vscode代码美化; 1)文件 —> 首选项 因为 VSCode 默认启用了根据文件类型自动设置tabsize的选项,在设置中添加: "editor.detectIndentation": false 2)编辑器配置 在项目文件中新建 .editorconfig 文件为特定类型文件指定缩进大小、缩进类型(空格,或tab),是否自动插入末行等等。 root = true [*] charset = utf-8 indent_style = tab indent_size = 4 insert_final_newline = true trim_trailing_whitespace = true [*.md] max_line_length = off trim_trailing_whitespace = false 3)安装 VsCode 格式化代码插件 搜索并安装 Beautify 格式化代码插件 打开要格式化的文件 —> F1 —> Beautify file —> 选择你要格式化的代码类型 4)格式化对齐快捷键: Windows: Ctrl + K + F Windows:Shift + Alt + F Mac: Shift + Option + F Ubuntu: Ctrl + Shift + I ...

August 25, 2021 · 1 min · Rancho

H750枚举U盘拖拽式BootLoader+外部spi_flash

程序已经写好了; Github地址:https://github.com/fan-pengfei/Bootloader_H750_SD/tree/master

August 22, 2021 · 1 min · Rancho

oled使用技巧

OLED 局部刷新提高帧率. 待续

August 20, 2021 · 1 min · Rancho

Stm32蓝牙串口下载

之前准备电赛的时候,需要用到无线调试器,先是上淘宝看了一下,基本都是大几百,所以想着自己自制一个,直接搞DAP无线调试器有点难,所以就用手头现有的蓝牙模块搞了一个串口无线下载器,调试的话就靠printf打印了; 也做了好几个版本,最初的版本主要有两个大的问题: 1、没有程序校验过程,不能保证单片机收到的APP程序是完整且正确的; 2、没有错误解决机制,一旦APP程序错误或者程序跑飞,就必须手动按下复位键进行复位; 为解决以上两个问题,采取了以下措施 1、对APP程序加入CRC校验; 2、加入看门狗,解决程序跑飞问题; 以下是关于这个项目的具体介绍: 一、APP程序部分 首先要有一个APP程序,与一般的程序相比,APP程序有两个地方需要进行配置: 分别如下图所示: 1、在system_stm32f4xx.c中进行修改: 2、在小锤子那里进行修改: 3、修改完毕后,进行正常的编译即可; 二、BIN文件的处理 最初的版本并没有加入crc校验,所以经常会出错,导致程序经常跑飞,所以加入了crc32校验;经检验,效果那是非常的好; 为什么是采用bin文件而不是使用更容易得到的hex文件呢? 原因很简单:因为写入单片机flash的程序实际就是bin文件,hex文件需要转换才能写进flash中; 以上操作只是得到了hex文件,而我们需要的是bin文件,以下是对hex文件的处理过程: 1、第一步呢,当然是得到最初的bin文件;而Keil默认情况下编译成功后生成的是Hex文件,而不是bin文件,所以要将Hex文件转换为bin文件,当然是有现成的Hex转bin的程序的,但是比较麻烦,可以用Keil自带的功能完成编译后自动生成bin文件的过程,具体的方法请自行百度; 这是我的配置,仅供参考: D:\Keil_v5\ARM\ARMCC\bin\fromelf.exe —bin -o fromelf —bin -o “$L@L.bin” “#L” 2、然后是对bin文件进行处理,也就是crc32校验码的生成以及插入该校验码到bin文件中,我用的是python脚本的方式,代码如下: # -*- coding:utf-8 -*- import binascii import os import sys def crc2hex(crc): res='' for i in range(4): t=crc & 0xFF crc >>= 8 res='%02X%s' % (t, res) return res inputfile = "E:\IAP\APP\Project\OBJ\STM32F407.bin"#实际存放的bin文件路径 isfile = os.path.isfile(inputfile); print(inputfile); fp = open(inputfile, "r+b") #直接打开一个文件,如果文件不存在则创建文件 filesize = os.path.getsize(inputfile) print("ZI app firmware size:", filesize, "bytes.") #计算bin文件的CRC,首先清空CRC32区域的4个byte fp.seek(0x1c, 0)#从bin文件开始,偏移地址为0x1c的地方存放bin的CRC32 clear4bytes = '00000000' c4 =binascii.unhexlify(clear4bytes) fp.write(c4) #将CRC32存放的区域4bytes清零 fp.seek(0, 0)#从0开始读取整个bin file_content = fp.read()#读整个文件内容到 file_content crc = binascii.crc32(file_content) print('CRC32:', hex(crc)) fp.seek(0x1c, 0)#从bin文件开始,偏移地址为0x1c的地方存放bin的CRC32 #存放计算CRC32四个字节 crcstr_2 = crc2hex(crc) r=binascii.unhexlify(crcstr_2) fp.write(r) fp.close() sys.exit(0)##正常退出 代码我就不多解释了,应该还是挺容易看懂的; ...

August 19, 2021 · 3 min · Rancho