找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5299|回复: 9
收起左侧

基于STM32的DMX512通信控制RGB灯带程序问题

[复制链接]
ID:326235 发表于 2021-1-18 17:01 | 显示全部楼层 |阅读模式
30黑币
程序是让灯带只亮红色并呼吸效果,当cnr增加到0x80时,会出现全部灯熄灭的情况,测出来波形是32us长低电平+12us高电平导致的初始化(个人猜测),如何避免该数据造成的初始化,希望有人解答一下

int main(void)
{
        u8 key;
        u8 i=0,t=0,u = 0;
        u8 cnr = 0x00;
        u8 cnb = 0x00;
        u8 cng = 0x00;
        u8 rs485buf[35];
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        delay_init(168);  
        uart_init(115200);      
        
        LED_Init();   
         LCD_Init();
        KEY_Init();
        RS485_Init(250000);
        Dat_Rst_Init();
         delay_ms(100);
        LED0 = 1;
        
        DatRst = 0;     
        delay_us(88);
        DatRst = 1;
        delay_us(8);
        DatRst = 0;
        delay_us(32);
        DatRst = 1;
        delay_us(8);
        for( i = 0; i < 30; i++ )
        {
                rs485buf[ i] = 0x00;
        }
        RS485_Send_Data(rs485buf,30);
        
        while(1)
        {
                DatRst = 0;
                delay_us(88);
                DatRst = 1;
                delay_us(8);
                DatRst = 0;
                delay_us(32);
                DatRst = 1;
                delay_us(8);
                for( i = 0; i < 30; i = i+3 )
                {
                        rs485buf[i ] = cnr;
                        rs485buf[i+1] = cnb;
                        rs485buf[i+2] = cng;
                }
                RS485_Send_Data(rs485buf,30);
                delay_ms(10);
                switch(u)
                {
                        case 0:
                                cnr = cnr + 0x01;
                        if(cnr == 0xFF)
                                {
                                        cnr = 0xFF;
                                        u = 1;
                                }
                                break;
                        case 1:
                                cnr = cnr - 0x01;
                        if(cnr == 0x00)
                        {
                                cnr = 0x00;
                                u = 0;
                        }
                        break;
                        default:
                                u = 0;
                        break;
                }
        }   
}

回复

使用道具 举报

ID:390416 发表于 2021-1-19 01:04 | 显示全部楼层
以下代码是DMX512发送代码,使用STC8F单片机。出自《人人学会单片机》
  1. bit DMX512_RB8_ok=0;                                             //保存串口的第八位数据
  2. bit Uart2_Flag=1;                                                        //发送控制标志位

  3. u8 xdata DMX512_Write_Buffer[Pixel_Num];
  4. #define BREAK 8                                                                //这个是控制BREAK的低电平复位时间的
  5. #define MAB BREAK+2                                                        //这个是控制复位后MAB时间的
  6. #define MAREK BREAK+4                                                //这个是控制复位后MAB时间的
  7. #define DMX512_OUT P11
  8. //********************************************************************* [url=http://wqxdz.taobao.com]http://wqxdz.taobao.com[/url] ---祁绪电子---2020年5月 *************
  9. // 定时器4、定时器2、串口2初始化配置 波特率250000bps可变,9位数据,下载主频设置为24MHz
  10. //********************************************************************* [url=http://wqxdz.taobao.com]http://wqxdz.taobao.com[/url] ---祁绪电子---2020年5月 *************
  11. void DMX512_Init()
  12. {
  13.         T4T3M |= 0x20;                                                        //定时器T4工作在1T模式
  14.         T4L = 0xF0;                                                                //初值,定时22us
  15.         T4H = 0xFD;                                                                //初值,定时22us
  16.         T4T3M |= 0x80;                                                        //定时器开始计时
  17.         IE2|=0X40;                                                                //定时器4中断允许
  18.         
  19.         S2CON = 0x88;                                                        //9位数据,可变波特率
  20.         AUXR |= 0x04;                                                        //定时器2时钟为晶振时钟
  21.         T2L = 0xE8;                                                                //定时器初值,定时时间*4=波特率
  22.         T2H = 0xFF;                                                                //定时器初值,定时时间*4=波特率
  23.         AUXR |= 0x10;                                                        //启动定时2
  24.         IE2|=0X01;                                                                //定时器2中断允许
  25.         //IP2H|=0X01;                                                        //串口中断改成最高优先级
  26.         //IP2|=0X01;                                                        //串口中断改成最高优先级
  27.         EA=1;                                                                        //总中断打开
  28.         DMX512_Write_Buffer[0]=0;                                //DMX512规范,第0字节发送的是0;
  29. }
  30. //********************************************************************* [url=http://wqxdz.taobao.com]http://wqxdz.taobao.com[/url] ---祁绪电子---2020年5月 *************
  31. // DMX512发送函数
  32. //********************************************************************* [url=http://wqxdz.taobao.com]http://wqxdz.taobao.com[/url] ---祁绪电子---2020年5月 *************
  33. void DMX512_TX_timer0() interrupt 20
  34. {
  35.         static u16 i;
  36.         static u16 count=0;
  37.         if(count<BREAK)                                                        //BREAK 复位拉低(根据项目调整参数)
  38.         {
  39.                 count++;
  40.                 DMX512_OUT=0;
  41.         }
  42.         else if(count<MAB)                                                //复位后拉高最少12us(根据项目调整参数)
  43.         {
  44.                 DMX512_OUT=1;
  45.                 count++;
  46.         }
  47.         if(count==MAB)                                                        //开始传输数据
  48.         {
  49.                 if(Uart2_Flag)                                                //上一个字节发送完成,中断置1后。
  50.                 {        
  51.                         S2CON|=0x08;                                        //DMX512的字节是9位数据,有两个停止位,第8bit是TB8中。
  52.                         S2BUF=DMX512_Write_Buffer[i];        //发送字节
  53.                         Uart2_Flag=0;                                        //未发送完,不允许再进来                                
  54.                         i++;                                                        //下一个字节
  55.                         if(i>=Pixel_Num)                                //大于总字节数量
  56.                         {
  57.                                 i=0;
  58.                                 count++;
  59.                         }
  60.                                                                                         //延时,使两位停止位+空闲总共达到12us
  61.                 }
  62.         }
  63.         if(count>MAB)                                                        //字节发送完之后,其余时间空闲,本程序是0~24字节,后面空闲
  64.         {
  65.                 DMX512_OUT=1;
  66.                 count++;
  67.                 if(count>100)                                                //100  用于控制帧率,DMX512标准是 最多44帧数据包
  68.                 {
  69.                         count=0;
  70.                 }
  71.         }
  72. }

  73. //********************************************************************* [url=http://wqxdz.taobao.com]http://wqxdz.taobao.com[/url] ---祁绪电子---2020年5月 *************
  74. // 串口中断
  75. //********************************************************************* [url=http://wqxdz.taobao.com]http://wqxdz.taobao.com[/url] ---祁绪电子---2020年5月 *************
  76. void Uart2_Routine (void) interrupt 8
  77. {        
  78.         S2CON&=0xed;                                                        //清除发送中断标志
  79.         Uart2_Flag=1;                                                        //标志位允许下一个字节发送
  80. }
复制代码
回复

使用道具 举报

ID:752974 发表于 2021-1-19 10:12 | 显示全部楼层
这个协议没用过,不懂,只能帮你顶一下。
回复

使用道具 举报

ID:373388 发表于 2021-1-19 10:19 | 显示全部楼层
你描述的不是很清楚,你这个应该是主控端指令系统,终端控制执行部分,硬件是什么样子的,根据你的指令协议怎么工作的,都没有讲,怎么帮你分析啊

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:326235 发表于 2021-1-25 14:43 | 显示全部楼层
xhaity 发表于 2021-1-19 10:19
你描述的不是很清楚,你这个应该是主控端指令系统,终端控制执行部分,硬件是什么样子的,根据你的指令协议 ...

用STM32开发板的485接口发送DMX512通用协议写呼吸灯效果,解码芯片为TM512AC,我测试了波形之后,发现从0x00到0x7F的亮度变化和0x80到0xFF的亮度变化一样,测试得出解码输出的PWM波低电平占空比到0x7F就满了,然后从0x80PWM波低电平占空比又从0开始到0xFF满,说明这个解码芯片输出PWM波最大值是127,而不是正常的255,因为正常的DMX512通信协议是到255才是最亮的,所以问一下你们有没有碰到这种情况,对这个TM512AC了解吗。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:326235 发表于 2021-1-25 14:52 | 显示全部楼层
我解释一下硬件和后续,硬件采用的是TM512AC解码芯片的灯带,自带解码和输出PWM功能,但是DMX512通用协议对于灯光的控制一般是从0到255灯光从最暗到最亮,所以我写的时候cnr就是一直+1,当加到0x80的时候,灯就灭掉了,然后又慢慢亮,效果就是呼吸亮两次,呼吸灭两次。
后续我测试之后,发现这个解码芯片的PWM输出低电平占空比(就是灯亮的电平占空比)从0x00的0%到0x7F的100%,然后到0x80又变成了0%,到0xFF的100%,那么说明它的控制输出,从0到127就可以了,但是我是第一次用这个协议做,对于这款解码芯片也不是很了解,就是问一下这样合理吗,你们有没有碰到这种情况。
结论就是我帖子里的猜想是错误的,DMX512通信里的数据帧并不会触发初始化,但是上述的情况大家是否碰到过可以探究探究。也是给以后可能用到的人一个提醒吧。

评分

参与人数 1黑币 +30 收起 理由
admin + 30 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:373388 发表于 2021-2-7 10:16 | 显示全部楼层
具体的你看看数据手册吧 说明TM512AC这个芯片就是7bit pwm占空比, 最高位有可能其他含义;说明128当作 0处理了,正好符合 测试现象;  你就把数据范围控制在0-127,如果能满足你的控制要求就行了,要不满足控制要求,就选择其他芯片了
回复

使用道具 举报

ID:326235 发表于 2021-2-27 17:11 | 显示全部楼层
xhaity 发表于 2021-2-7 10:16
具体的你看看数据手册吧 说明TM512AC这个芯片就是7bit pwm占空比, 最高位有可能其他含义;说明128当作 0处 ...

好的,谢谢
回复

使用道具 举报

ID:634016 发表于 2022-1-11 16:14 | 显示全部楼层
这头像也太萌了吧
回复

使用道具 举报

ID:77589 发表于 2023-8-2 17:43 | 显示全部楼层
顶一下
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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