查看: 328|回复: 1
打印 上一主题 下一主题

STM32驱动TM1812经验分享

[复制链接] qrcode

37

主题

41

帖子

123

积分

注册会员

Rank: 2

积分
123
楼主
跳转到指定楼层
发表于 2015-7-19 01:22 PM | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这段时间一直在用STM32驱动TM1812,期间遇到了不少的问题,网上搜贴却很难找到解决方法,所以笔者将这段时间来遇到的问题逐一简述,希望对用到TM1812的朋友有所帮助。
一、关于TM1812硬件电路设计问题
首先TM1812是一款串行输入的全彩LED驱动芯片,具体的相关数据可以参考数据手册,这里不赘述。TM1812采用PWM驱动LED,所以需要在LED上串联合适的限流电阻,这里还应考虑到功耗问题,对于5V的电源电压,笔者采用R串联180欧姆的电阻,G、B串联150欧姆的电阻。
二、关于时序问题
TM1812采用串行数据输入,所以稳定的时序是非常重要的。由于芯片的高低电平保持时间只有几百纳秒,所以用定时器延时反而达不到很好的效果,笔者开始就采用系统定时器进行延时的,结果产生咬尾。直接采用__nop()_函数进行延时,当然也可以采用for循环进行延时。这里笔者建议不要将延时程序封装成函数,而是写成宏,因为调用函数会占用几个甚至几十个周期,这样产生的时序效果不好,写成宏可以在预编译时展开,相关的程序片段如下:
#define DIN_BIT_0()                 do{                                                                                             //0码
                                        GPIOA->BSRR = (uint16_t)0x0040;                                         //I/O口置0
                                        _nop();                                                                                   //若干个_nop()
                                       GPIOA->BRR = (uint16_t)0x0040;                                            //I/O口置1
                                       __nop();                                                                                 //若干个_nop()
                                                                                                }while(0)
#define DIN_BIT_1()                 do{                                                                                             //1码
                                        GPIOA->BSRR = (uint16_t)0x0040;                                         //I/O口置0
                                        _nop();                                                                                   //若干个_nop()
                                       GPIOA->BRR = (uint16_t)0x0040;                                            //I/O口置1
                                       __nop();                                                                                 //若干个_nop()
                                                                                                }while(0)

程序中具体有多少个_nop()函数视具体MCU而定,最好能用示波器看一下波形,确定合适的个数。宏里面的可以网上查阅C语言相关。
三、关于电平转换问题
关于电平问题,TM1812的官方数据手册里有点略坑,数据手册里说芯片高电平输入的最低电压是3.8V,我们知道STM32电源电压是3.3V,而TM1812电源电压是5V,所以一开始就考虑到电平转换,但是时序的开关频率大概能达到4到5M左右,采用三极管和MOS管都不能得到很好的输出,这大概折腾了将近一星期,结果。。。结果TM1812和3.3V是完全兼容的。。。完全不需要电平转换就能很好的驱动,所以大家一定要亲自实践了才行。
(笔者认为互联网的最大的好处就是分享,自己遇到的问题他人也可能遇到,所以大家可以解决后发到网上,这样其他人就可以少走弯路了)



回复

使用道具 举报

0

主题

70

帖子

8

积分

新手上路

Rank: 1

积分
8
沙发
发表于 2016-7-28 09:07 AM | 只看该作者
这段时间一直在用STM32驱动TM1812,期间遇到了不少的问题,网上搜贴却很难找到解决方法,所以笔者将这段时间来遇到的问题逐一简述,希望对用到TM1812的朋友有所帮助。
一、关于TM1812硬件电路设计问题
首先TM1812是一款串行输入的全彩LED驱动芯片,具体的相关数据可以参考数据手册,这里不赘述。TM1812采用PWM驱动LED,所以需要在LED上串联合适的限流电阻,这里还应考虑到功耗问题,对于5V的电源电压,笔者采用R串联180欧姆的电阻,G、B串联150欧姆的电阻。
二、关于时序问题
TM1812采用串行数据输入,所以稳定的时序是非常重要的。由于芯片的高低电平保持时间只有几百纳秒,所以用定时器延时反而达不到很好的效果,笔者开始就采用系统定时器进行延时的,结果产生咬尾。直接采用__nop()_函数进行延时,当然也可以采用for循环进行延时。这里笔者建议不要将延时程序封装成函数,而是写成宏,因为调用函数会占用几个甚至几十个周期,这样产生的时序效果不好,写成宏可以在预编译时展开,相关的程序片段如下:
#define DIN_BIT_0()                 do{                                                                                             //0码
                                        GPIOA->BSRR = (uint16_t)0x0040;                                         //I/O口置0
                                        _nop();                                                                                   //若干个_nop()
                                       GPIOA->BRR = (uint16_t)0x0040;                                            //I/O口置1
                                       __nop();                                                                                 //若干个_nop()
                                                                                                }while(0)
#define DIN_BIT_1()                 do{                                                                                             //1码
                                        GPIOA->BSRR = (uint16_t)0x0040;                                         //I/O口置0
                                        _nop();                                                                                   //若干个_nop()
                                       GPIOA->BRR = (uint16_t)0x0040;                                            //I/O口置1
                                       __nop();                                                                                 //若干个_nop()
                                                                                                }while(0)

程序中具体有多少个_nop()函数视具体MCU而定,最好能用示波器看一下波形,确定合适的个数。宏里面的可以网上查阅C语言相关。
三、关于电平转换问题
关于电平问题,TM1812的官方数据手册里有点略坑,数据手册里说芯片高电平输入的最低电压是3.8V,我们知道STM32电源电压是3.3V,而TM1812电源电压是5V,所以一开始就考虑到电平转换,但是时序的开关频率大概能达到4到5M左右,采用三极管和MOS管都不能得到很好的输出,这大概折腾了将近一星期,结果。。。结果TM1812和3.3V是完全兼容的。。。完全不需要电平转换就能很好的驱动,所以大家一定要亲自实践了才行。
(笔者认为互联网的最大的好处就是分享,自己遇到的问题他人也可能遇到,所以大家可以解决后发到网上,这样其他人就可以少走弯路了)


回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表