SK6812驱动入门

我看数据手册一般是特性、引脚定义、外围电路、时序图以及驱动代码。 

特性

● Top SMD内部集成高质量外控单线串行级联恒流IC;
● 控制电路与芯片集成在SMD 3528元器件中,构成一个完整的外控像素点,色温效果均匀且一致性高。
● 内置数据整形电路,任何一个像素点收到信号后经过波形整形再输出,保证线路波形畸变不会累加。
● 内置上电复位和掉电复位电路,上电不亮灯;
● 灰度调节电路( 256级灰度可调),
● 红光驱动特殊处理,配色更均衡,
● 单线数据传输,可无限级联。
● 整形转发强化技术,两点间传输距离超过10M.
● 数据传输频率可达800Kbps, 当刷新速率30帧/秒时,级联数不小于1024点。

引脚定义

典型电路

在实际应用电路中,为防止产品在测试时带电插拔产生的瞬间高压损伤IC内部信号输入输出引脚,应在信号输入及输出端串接保护电阻。此外,为了使各IC芯片间更稳定工作,各灯珠间的退偶电容则必不可少;

时序图

看到这里就大致知道器件的功能了,剩下的就是要去关注驱动的注意点。

 由于我采用PWM+DMA的方式去驱动SK6812,所以需要了解器件的数据传输时间和数据传输规则,方便确定我们的周期。

数据传输时间

从数据手册中可以看到厂家规定是码元周期最小为1.2us,所以我们采用PWM驱动时需要周期不大于1.2us。

逻辑“1”代表占空比在64%左右,逻辑“0”代表在33%左右。

24bit数据结构

24bit的数据是按照GRB的顺序发送,所以我们选择HEX转RGB时要注意“R”与"G"的HEX要交换一下位置。

 数据传输方式

灯数据刷新的间隔要大于80us。

代码

初始化定时器3和输出比较器。

  /* Compute the prescaler value */
  PrescalerValue = (uint16_t) (SystemCoreClock / 20000000) - 1;
  /* TMRe base configuration */
  TMR_TimeBaseStructInit(&TMR_TMReBaseStructure);
  TMR_TMReBaseStructure.TMR_Period = 20;
  TMR_TMReBaseStructure.TMR_DIV = PrescalerValue;
  TMR_TMReBaseStructure.TMR_ClockDivision = 0;
  TMR_TMReBaseStructure.TMR_CounterMode = TMR_CounterDIR_Up; 

  TMR_TimeBaseInit(TMR3, &TMR_TMReBaseStructure);

  /* PWM1 Mode configuration: Channel1 */
  TMR_OCStructInit(&TMR_OCInitStructure);
  TMR_OCInitStructure.TMR_OCMode = TMR_OCMode_PWM1;
  TMR_OCInitStructure.TMR_OutputState = TMR_OutputState_Enable;
  TMR_OCInitStructure.TMR_Pulse = CCR1_Val;
  TMR_OCInitStructure.TMR_OCPolarity = TMR_OCPolarity_High;

  TMR_OC1Init(TMR3, &TMR_OCInitStructure);

  TMR_OC1PreloadConfig(TMR3, TMR_OCPreload_Enable);

 初始化DMA。ss

void DMA_Configuration(void)
{
  DMA_InitType DMA_InitStructure = {0};

  /* DMA1 Channel5 Config */
  DMA_Reset(DMA1_Channel6);
  DMA_DefaultInitParaConfig(&DMA_InitStructure);
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&TMR3->CC1;
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SRC_Buffer;
  DMA_InitStructure.DMA_Direction = DMA_DIR_PERIPHERALDST;
  DMA_InitStructure.DMA_BufferSize = sizeof(SRC_Buffer);
  DMA_InitStructure.DMA_PeripheralInc = DMA_PERIPHERALINC_DISABLE;
  DMA_InitStructure.DMA_MemoryInc = DMA_MEMORYINC_ENABLE;
  DMA_InitStructure.DMA_PeripheralDataWidth = DMA_PERIPHERALDATAWIDTH_HALFWORD;
  DMA_InitStructure.DMA_MemoryDataWidth = DMA_MEMORYDATAWIDTH_HALFWORD;
  DMA_InitStructure.DMA_Mode = DMA_MODE_NORMAL;
  DMA_InitStructure.DMA_Priority = DMA_PRIORITY_HIGH;
  DMA_InitStructure.DMA_MTOM = DMA_MEMTOMEM_DISABLE;

  DMA_Init(DMA1_Channel6, &DMA_InitStructure);

  /* DMA1 Channel5 enable */
  DMA_ChannelEnable(DMA1_Channel6, ENABLE);
}

使能定时器的预装载器、DMA和使能定时器。

  TMR_ARPreloadConfig(TMR3, ENABLE);

	TMR_DMACmd(TMR3, TMR_DMA_CC1, ENABLE);
  /* TMR3 enable counter */
  TMR_Cmd(TMR3, ENABLE);

根据数据手册可知, 周期我设置为20,所以13代表逻辑“1”,7代表逻辑“0”.

uint16_t SRC_Buffer[]={
	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, \
	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, \
	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, \
	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, \
	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, \

	//按照GRB的顺序
  //FF0000 green
	13,13,13,13,13,13,13,13,\
	7,7,7,7,7,7,7,7,\
	7,7,7,7,7,7,7,7,\
	
	 //00FF00 red
	7,7,7,7,7,7,7,7,\
	13,13,13,13,13,13,13,13,\
	7,7,7,7,7,7,7,7,\
	
	//0000FF blue
	7,7,7,7,7,7,7,7,\
	7,7,7,7,7,7,7,7,\
	13,13,13,13,13,13,13,13,\
};

上面的数据代码表示先用100us的低电平复位灯,按照GRB的顺序第一个灯显示绿色,第二个灯显示红色,第三个灯显示蓝色。

以上例程是基于雅特力AT32F407平台写的,不过在其他都一样可用。 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值