软硬件全开源,航芯方案分享 | 热敏打印机方案

随着电子信息化、自动化程度提高,条码识别技术的发展,热敏打印机的应用范围也在不断扩大,已从传统的办公和家庭传真文档,快速向商业零售、工业制造业、交通运输业、物流、金融、彩票、医疗、教育等新兴专业应用领域拓展。

本文将为大家介绍基于上海航芯ACM32F403的热敏打印机设计方案。

打印原理

热敏打印机的原理是,在介质基底上(通常是纸)覆上一层热敏材料,将热敏材料加热一段时间后变成深色(一般是黑色,也有蓝色)。这种化学反应是在一定的温度下进行的。高温会加速这种化学反应。当温度低于60℃时,热敏材料需要经过相当长,甚至长达几年的时间才能变成深色;而当温度为200℃时,这种反应会在几微秒内完成。

热敏打印机有选择地在热敏纸的确定位置上加热,由此就产生了相应的图形。加热是由与热敏材料相接触的打印头上的一个小电子加热器提供的。加热器排成方点或条的形式由打印机进行逻辑控制,当被驱动时,就在热敏纸上产生一个与加热元素相应的图形。控制加热元素的同一逻辑电路,同时也控制着进纸,因而能在整个标签或纸张上印出图形。

图1. 热敏打印机的原理

使用芯片

本文描述的热敏打印机方案,是基于上海航芯ACM32F403系列的MCU进行设计。

ACM32F403芯片采用高性能内核,支持Cortex-M33和Cortex-M4F指令集。芯片内核支持一整套DSP指令用于数字信号处理,支持单精度FPU处理浮点数据,同时还支持Memory Protection Unit(MPU)用于提升应用的安全性。

ACM32F403系列芯片最高工作频率可达180MHz,内嵌数学硬件加速,内置最大512KB的eFlash和最大192KB SRAM。芯片集成了一个12位多通道2M sps高精度ADC、一个12位2通道的DAC、多达3路运放、2路比较器,集成了1个高级定时器,6个通用16位定时器,1个通用32位定时器,2个基本16位定时器,1个系统看门狗,1个独立看门狗,一个低功耗的实时钟(RTC),内置多路UART、LPUART、SPI、I2C、I2S、CAN、全速USB等丰富的通讯外设,内建AES、CRC、TRNG等算法模块。

方案特点

ㆍ支持蓝牙、USB、UART等多种通讯接口的打印方式

ㆍ支持无任务时自动进入断电模式,续航时间更长

ㆍ支持打印高温、缺纸和低电量报警

ㆍSPI FLASH存放字库,支持在线更新字库,可调整字体、大小、粗细等

ㆍ支持MCU和BLE芯片固件在线升级

设计方案

图2. 基于ACM32F403热敏打印机设计方案框图

功能介绍

1.1多接口打印流程

本方案可以通过UART、USB和蓝牙接口接收数据,并通过ACM32F403芯片的Timer,GPIO,ADC、SPI等模块进行热敏打印机头的打印工作。

具体流程如下:

1)通过UART、USB和蓝牙接口接收数据,数据需要通过GBK码的方式发送,并存储到芯片内部;

2)将每个字的GBK码,通过SPI接口查询到SPI FLASH上字库中对应的数据,并传输到打印buffer中;

3)芯片通过Timer来控制步进电机运行的速度和打印机头加热的时间,通过GPIO来控制加热使能和控制步进电机的前进和后退,ADC来检测打印机温度,最终完成打印工作。

图3. 多接口打印流程

1.2 字库更新流程

本方案内部firmware实现了一个UART接收数据,SPI下载数据的系统,采用类似7816 T=1的数据格式进行传输,将字库的BIN文件下载到SPI FLASH中,以实现字库的下载和更新。因为片外SPI FLASH大小的原因,默认只支持24*24大小的字体打印,如果更换字体,需要重新下载字库文件。

图4. 字库下载流程

本方案支持字库的更新,可以调节打印字体的字体、大小,粗细等参数。字库更新后需要修改firmware代码,以实现不同字体的打印。

图5. 字体设置参数

1.3 字库调用流程

本方案中的SPI FLASH中能存放字体大小为1616或2424的字库,并且有完整的配套firmware代码。

具体字库调用流程如下:

1)从UART、USB或BLE接口接收需要打印文字的GBK码;

2)根据GBK码计算出该文字在字库中的内码;

3)通过SPI接口读取字库中内码的数据,数据长度根据字体大小来定;

4)将读出的数据传输到打印机头,完成打印。

图6. 字库调用流程

1.4 数据打印流程

图7. 数据打印软件流程

图8. 打印机芯和步进电机原理图

数据打印流程:

1)打印机开机流程;

2)将打印数据通过SPI接口传输到打印机缓存;

3)判断是否是第一行,如果是打开电机Timer,并前进一步;

4)判断是否是最后一行或者是否缺纸,如果是进入打印机关机流程;

5)开始加热,打开加热Timer,并等待加热完成;

6)循环2)~5),直到打印完毕。

打印机开机流程:

1)将打印机DST(选通脉冲)信号设为低电平;

2)将打印机LATCH(数据锁存)信号设为高电平;

3)打开热敏头逻辑电源;

4)打开热敏头加热电源;

打印机关机流程:

1)停止加热Timer;

2)关闭热敏头加热电源;

3)将打印机DST(选通脉冲)信号设为低电平;

4)将打印机LATCH(数据锁存)信号设为高电平;

5)关闭热敏头逻辑电源。

1.5 电源控制系统介绍

图9. 电源控制系统介绍

1)供电:系统采用单节锂电池4.2V或者USB 5V供电;

2)异常:当MCU内部程序跑飞/死机时,首先可以按下SW1复位MCU,再不行可以按住正常开/关机键,再插入USB线使MCU复位;

3)开机:系统未通电时,按住开/关机键,此时MCU上电,MCU开始从eFlash启动,初始化成功后将POWER_ON/OFF信号置高,双色灯中的绿灯点亮(InitPass_常亮、内部锂电池充电满_常亮),若初始化失败或检测到异常/错误(比如电池电量低,外设初始化失败、通信不正常等),将双色灯中的红灯点亮(Err1_常亮、Err2_1s闪、Err3_快闪);

4)关机:系统通电时,按住开/关机键,Power_Check引脚会检测到一个下降沿,并且接着会有持续的低电平,松开按键后,再将电源控制信号拉低;

5)正常关机的顺序是:先灭灯,然后断电机驱动电源和外设电源,再断MCU电源;

6)PB1为开/关机按键与系统唤醒键,SW1为系统唤醒按键与复位键,通常情况,用户按一下是要唤醒系统,长按是正常开关机;

7)没有打印任务时,需要关闭电机电源和外设电源,来节省锂电池电量;所以系统经过定时进入待机前,MCU关闭电机驱动电源/外设电源后,进入待机。

资源分享

Gitee资源:

https://gitee.com/acm32-mcu/t...

ACM32F303对比STM32F103差异说明:

https://aijishu.com/a/1060000...

STM32F103标准外设库SPL移植说明(ACM32F403):

https://aijishu.com/a/1060000...

航芯MCU软件HAL库使用说明及STM32 API差异说明:

https://aijishu.com/a/1060000...

如需销售咨询,请邮件至:sales@aisinochip.com

  • 0
    点赞
  • 13
    收藏
  • 打赏
    打赏
  • 0
    评论
可能感兴趣的项目设计:应用于 POS 机、收银机等80mm 高速微型打印机(原理图、上位机、程序源码) 附件内容截图: 字库改组: 为了便于处理,我们对字模进行如下改组: 把 16 X 16 汉字,分成左边从上到下16个字节,和右边16个字节,目的是可以把一个汉字当成两个 16X8 字母或数字处理。 改组后,字模数据从 RAM 读出送往打印机时,无论是汉字还是字母或数字,第n行点的 "字节数据" 就是: n, n+16, n+16*2, n+16*3......一行取48个字节, 8*48=384 个点。 把 24 X 24 汉字,分成左边从上到下 24行 X 12列, 和右边 24 X 12 数据,一行 12bit 数据存放在半字 16bit 中的低12bit, 左右半边都有 24个"半字",或 48 个字节,一个24X24汉字变成96个字节了。如此处理字模时,把一个汉字当成两个 24 X 12 字母或数字来处理。 不管汉字字母或数字,第n行点的 ”半字数据“ 就是 n,n+24,n+24*2,n+24*3......取32个"半字",刚好够 12bit*32=384 个点,即一行可打 32个字母,或16个汉字。 字模写入 SPI FLASH 时,完成以上变换。打印时,NUC123 从 SPI FLASH 读出的字模,认为是上述变换后的格式。 高速 SPI 接口传输数据 打印时,字模数据要从 W25Q16 中通过 SPI 接口读取,再通过 SPI 接口移入打印头。 一行 16个 24 X 24 汉字有 16*96 = 1536 个字节。字符行与行之间一般有一到三个空行,走纸最快时 90mm/秒,694us 走一行,在这个时间内要读取所有 1536个字节,放入 RAM 打印缓冲区。代码中,把 SPI 配置成 28.8Mbps 从FLASH 中读取字模,为便于用示波器查看波形,每次收发 16bit 中间,插入一个空闲 CLK,收发完 1536 Byte 要经过 1536/2 = 768 次 17bit 时钟,时间为 768*17/28.8 = 453us。关键是 SPI 收发 16bit 中间不能再有额外间隙,否则 28.8Mbps 失去意义,所以代码中,使能 SPI 的 FiFo,同时配置 PDMA 来完成 SPI 收发。 点数据移入打印头,SPI 速率配置为 4.8Mbps,384个点。数据传输时间约为 384/4.8 = 80us,走纸最快 90毫米/秒 时 694us走一行,数据早传完了。走纸速度再快一倍也来得及。 USB 打印机模式 USB 打印模式,上位机传输过来的,是图形点阵数据与命令混在一起,无需从 SPI FLASH 中读字模,只要把点数据从USB数据流里分离出来,移入打印头即可。代码中定义了一个 4096 字节的环形缓冲区。 USB 数据中断: 分析数据流,见函数 PTR_Data_Receive(), 遇图形点阵数据流,写入环形缓冲区。遇命令立即执行,或为执行做好准备。若有打印命令或走纸命令,就把 “走纸行数” 通过局变量 StepIncrease 传给主循环代码。 主循环里,1>若传过来的走纸行数 StepIncrease 不为0,就启动走纸。2>若已在走纸,就检查环形缓冲区是否有待打印数据——比较写入指针与读出指针的值可得知,若有待打印数据,就会在纸每走过一行时,把数据送入打印头并加热打印。 走纸,加热和数据传输,三者同时处理的时序 需要走纸时,只要设定速度值局变量 pStepM_TimLimit,然后调用走纸启动函数 PaperRollStart() 就开始走纸了,何时走下一行,何时停止,都在 Timer1 中断代码里处理。中断外面无需再处理走纸的事。 需要说明的是:有一个走纸剩余行数局变量 RemainderStep, 在此变量非0时,可以随时加大这个值,加长走纸行数。 再来看何时把数据串入打印头,何时加热,下图用鼠标点击可放大。 打印开始时,先启动走纸,前面空一两行没事,一行只有 0.0625mm。 把第一行点数据,串入打印头后,就等待走纸到第三行——由剩余步数局变量 RemainderStep 的值可得知。只要一走到第三行,立即输出点数据到加热头,并启动加热定时。然后就去处理下一行点数据。 每次在走到新的一行时(实际是两行), 都立即启动已准备好的、这一行数据的加热,接着代码去准备下一行点数据。 何时加热停止呢? 不用担心,由 Timer2 中断代码处理了。 打印开始时,必须知道要走几行, 两行一个点,一行 16 X 16 字符,要走 32行,一般还要加上开头和结尾的空行。 连续打印时,只要剩余行数 RemainderStep 不为0——走纸未停,可以随时增加这个值,加长走纸行数,继续打

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:1024 设计师:我叫白小胖 返回首页
评论

打赏作者

上海航芯

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值