找回密码
 立即注册
楼主: 梁工

BLDC三相无刷直流电机驱动-8H系列/32G系列-无HALL, 12万转, 视频讲解,改进启动算法

 火... [复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:53
  • 最近打卡:2024-12-27 08:18:49

0

主题

132

回帖

136

积分

注册会员

积分
136
发表于 2024-10-31 13:41:49 | 显示全部楼层
学习
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:53
  • 最近打卡:2024-12-27 08:18:49

0

主题

132

回帖

136

积分

注册会员

积分
136
发表于 2024-10-31 14:04:47 | 显示全部楼层
威武!!!
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:397
  • 最近打卡:2025-08-08 01:57:10

0

主题

7

回帖

1826

积分

金牌会员

积分
1826
发表于 2024-10-31 19:31:36 | 显示全部楼层
梁*** 发表于 2023-5-6 16:29
初始化程序,是移植(拷贝)过来的,初始化时,随便选一个通道都可以,因为这时候并没有启动ADC,所以选 ...

梁工你好,最近才开始按照你的图画了一个板子,程序这块我有两个问题请教一下,一是电机转动时,只需要在case 4这里采adc11的值吗?二是 adc11 = ((adc11 *7)>>3) + Get_ADC10bitResult(11)中,(adc11 *7)>>3是一种迭代的算法吗?
谢谢梁工

点评

因为比较器也使用了ADC输入端,为了避免竞争冲突,启动电机后在换相程序里做ADC,电机停止后在主程序做ADC。 adc11 = ((adc11 *7)>>3) + Get_ADC10bitResult(11); //这个是一阶数字低通滤波器,等效硬件的RC一阶低  详情 回复 发表于 2024-10-31 21:46
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:144
  • 最近打卡:2025-08-07 10:22:22

76

主题

6602

回帖

1万

积分

超级版主

积分
13727
发表于 2024-10-31 21:46:57 | 显示全部楼层
大脸猫*** 发表于 2024-10-31 19:31
梁工你好,最近才开始按照你的图画了一个板子,程序这块我有两个问题请教一下,一是电机转动时,只需要在 ...

因为比较器也使用了ADC输入端,为了避免竞争冲突,启动电机后在换相程序里做ADC,电机停止后在主程序做ADC。

adc11 = ((adc11 *7)>>3) + Get_ADC10bitResult(11);  //这个是一阶数字低通滤波器,等效硬件的RC一阶低通滤波。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:397
  • 最近打卡:2025-08-08 01:57:10

0

主题

7

回帖

1826

积分

金牌会员

积分
1826
发表于 2024-11-1 04:24:52 | 显示全部楼层
梁*** 发表于 2024-10-31 21:46
因为比较器也使用了ADC输入端,为了避免竞争冲突,启动电机后在换相程序里做ADC,电机停止后在主程序做AD ...

忽略比较器这边的使用了,理解了!谢谢梁工
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2024-12-10 18:14:16

0

主题

29

回帖

156

积分

注册会员

积分
156
发表于 2024-11-3 18:59:12 | 显示全部楼层
梁工你好!我按你开源的电路和开源程序做一个无霍尔的无刷直流电机控制器,已经做完了,调试好用,我要用编码器按档位调速,分六个档位,利用P32外中断和P34端口接编码器AB脚,利用外中断0读取编码器信号,都很好,就是用编码器的信号数据改变占空比,调速调不了,请教一下必须用PWM编码器函数调速吗?我这个利用外中断获取编码器信号数据调整占空比调速应该怎么编写程序,请梁工百忙中指教一下好吗。谢谢、 ...

点评

要用PID控制才行,根据编码器信号计算速度,再根据给定的速度,做PID稳速控制,其实不需要编码器都可以的,从换相信号即可得到转速信号,可以参考我的PID例子: 三相无刷电机驱动-32G系列-无HALL-PID控制-OLED显示-  详情 回复 发表于 2024-11-3 23:01
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:144
  • 最近打卡:2025-08-07 10:22:22

76

主题

6602

回帖

1万

积分

超级版主

积分
13727
发表于 2024-11-3 23:01:16 | 显示全部楼层
zwf3*** 发表于 2024-11-3 18:59
梁工你好!我按你开源的电路和开源程序做一个无霍尔的无刷直流电机控制器,已经做完了,调试好用,我要用编 ...

要用PID控制才行,根据编码器信号计算速度,再根据给定的速度,做PID稳速控制,其实不需要编码器都可以的,从换相信号即可得到转速信号,可以参考我的PID例子:

三相无刷电机驱动-32G系列-无HALL-PID控制-OLED显示-串口绘图
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=7472
(出处: 国芯技术交流网站)
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2024-12-10 18:14:16

0

主题

29

回帖

156

积分

注册会员

积分
156
发表于 2024-11-4 04:51:12 | 显示全部楼层
梁*** 发表于 2024-11-3 23:01
要用PID控制才行,根据编码器信号计算速度,再根据给定的速度,做PID稳速控制,其实不需要编码器都可以的 ...

谢谢梁工我这个编码器是一个实际应用的调速,并且方便档位调速,速度准确,电位器调速方便无级调速,对某一个速度不准确

点评

不好意思,我以为编码器是装在电机轴上测速度的,原来是手调编码器,海子街将调整的PWM值代替电位器的就可以了。  详情 回复 发表于 2024-11-4 09:49
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:144
  • 最近打卡:2025-08-07 10:22:22

76

主题

6602

回帖

1万

积分

超级版主

积分
13727
发表于 2024-11-4 09:49:55 | 显示全部楼层
zwf3*** 发表于 2024-11-4 04:51
谢谢梁工我这个编码器是一个实际应用的调速,并且方便档位调速,速度准确,电位器调速方便无级调速,对某 ...

不好意思,我以为编码器是装在电机轴上测速度的,原来是手调编码器,海子街将调整的PWM值代替电位器的就可以了。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2024-12-10 18:14:16

0

主题

29

回帖

156

积分

注册会员

积分
156
发表于 2024-11-4 18:04:53 | 显示全部楼层
梁工您好!
      这是我用EC11编码器调速在您的调速程序上改动的程序,出现的现象:就是换挡时,要停顿一下,然后启动效果就不好了,那种方法或函数可以让换挡时不停顿一下,连续换挡哪,请梁工指教帮助为盼       

                     if(B_RUN)        //正在运行中
                        {   ///*******************编码器EC11型     调速**********************************
//                                if(PWM_Value < PWW_Set) ADC11_Duty = PWM_Value+150;//PWM_Value++;        //加速油门跟随电位器   
//                                         
//                                if(PWM_Value > PWW_Set)        PWM_Value--;  //减速油门跟随电位器
//======================rotate编码器档位数值==============================================================
                                  if(rotate==0)    //关闭  第0挡     
                                                {
                                                        adc11 = 0;
                                                        B_RUN = 0;
                                                        PWM_Value = 0;
                                                        CMPCR1 = 0x8C;        // 关比较器中断
                                                        PWMA_ENO  = 0;
                                                        PWMA_CCR1L = 0;       
                                                        PWMA_CCR2L = 0;       
                                                        PWMA_CCR3L = 0;
                                                        PWM1_L=0;
                                                        PWM2_L=0;
                                                        PWM3_L=0;                       
                                                }
                                                if(rotate==1)   //启动 第1挡速度
                                                {   
                                                        PWM_Value++;                                                 
                                                        adc11 = ((adc11 *7)>>3) + PWM_Value+200;       
              if(PWM_Value>40)
                                                        PWM_Value = 40;                                                       
                                                }
                                                if(rotate==2)   //第2挡速度
                                                {   
                                                        PWM_Value++;                                                 
                                                        adc11 = ((adc11 *7)>>3) + PWM_Value+200;       
              if(PWM_Value>80)
                                                        PWM_Value = 80;                                                       
                                                }
                                                if(rotate==3)    //第3挡速度
                                                {   
                                                        PWM_Value++;                                                 
                                                        adc11 = ((adc11 *7)>>3) + PWM_Value+200;       
              if(PWM_Value>120)
                                                        PWM_Value = 120;                                                       
                                                }
                                                if(rotate==4)    //第4挡速度
                                                {   
                                                        PWM_Value++;                                                 
                                                        adc11 = ((adc11 *7)>>3) + PWM_Value+200;       
              if(PWM_Value>160)
                                                        PWM_Value = 160;                                                       
                                                }
                                          if(rotate==5)    //第5挡速度
                                                {   
                                                        PWM_Value++;                                                 
                                                        adc11 = ((adc11 *7)>>3) + PWM_Value+200;       
              if(PWM_Value>200)
                                                        PWM_Value = 200;                                                       
                                                }
                                                if(rotate==6)    //第6挡速度
                                                {   
                                                        PWM_Value++;                                                 
                                                        adc11 = ((adc11 *7)>>3) + PWM_Value+200;       
              if(PWM_Value>255)
                                                        PWM_Value = 255;                                                       
                                                }
                                               
//===================================================================================                               
                                if(PWM_Value < (D_START_PWM-10))            //停转, 停转占空比 比 启动占空比 小10/256
                                {
                                        B_RUN = 0;
                                        PWM_Value = 0;
                                        CMPCR1 = 0x8C;        // 关比较器中断
                                        PWMA_ENO  = 0;
                                        PWMA_CCR1L = 0;       
                                        PWMA_CCR2L = 0;       
                                        PWMA_CCR3L = 0;
                                        PWM1_L=0;
                                        PWM2_L=0;
                                        PWM3_L=0;
                                }
                                else
                                {
                                        PWMA_CCR1L = PWM_Value;
                                        PWMA_CCR2L = PWM_Value;
                                        PWMA_CCR3L = PWM_Value;
                                }
                        }
                        else    //启动
                                {
                                        if(rotate==1 )
                                        {                                                
                                                //PWM_Value = 40;       
                                                adc11 = ((adc11 *7)>>3) + PWM_Value+200;//Get_ADC10bitResult(11);  //ADC11输出数据                                                                  
                                          
                                        }         //直接用数据代替,就直接启动,数值要Get_ADC10bitResult(11)=200 以上
                                       
                                }                  
                                j = adc11;
                                if(j != adc11)       
                                        j = adc11;
                                PWW_Set = (u8)(j >> 5);        //油门是8位的
                后附视频
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-8-8 15:29 , Processed in 0.156837 second(s), 104 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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