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

三相无刷直流电机驱动-STC8H-带HALL 梁工例子

[复制链接]

该用户从未签到

1

主题

37

回帖

131

积分

注册会员

积分
131
发表于 2023-5-17 14:08:40 | 显示全部楼层
dong97512 发表于 2023-5-17 13:03
梁工,你好! 电机运作程序中,对PWMB_CCER2   不停的设置,是不是也会影响到PWM8  做PWM独立输出的正常 ...

刚才测试,PWM8 有脉宽输出了,应该 电机运作,改变了PWMB_ 中有关PWM8的设置,我再仔细看看,电机运转不改变到PWM8的寄存器设置应该就行了。
回复 支持 反对 送花

使用道具 举报

该用户从未签到

1

主题

37

回帖

131

积分

注册会员

积分
131
发表于 2023-5-19 10:08:16 | 显示全部楼层
梁工,你好! 目前PWM8 脉宽调制有输出了,目前发现高低电位切换时候,都出现一个尖峰问题,目前20K输出4% 脉宽,尖峰峰值都超5.5伏,万用表测试直流有效0.199伏了,我之前样品同样条件,输出20K 4% 脉宽,无尖峰,万用表直流有效值是0.150伏.  这样模拟工控信号用,误差太大了,看看如何消除这个尖峰值,谢谢了 !

点评

贴示波器波形照片,显示2个波形,我要看波形细节。  详情 回复 发表于 2023-5-19 10:15
回复 支持 反对 送花

使用道具 举报

该用户从未签到

45

主题

2914

回帖

6550

积分

超级版主

积分
6550
 楼主| 发表于 2023-5-19 10:15:03 | 显示全部楼层
dong97512 发表于 2023-5-19 10:08
梁工,你好! 目前PWM8 脉宽调制有输出了,目前发现高低电位切换时候,都出现一个尖峰问题,目前20K输出4%  ...

贴示波器波形照片,显示2个波形,我要看波形细节。
回复 支持 反对 送花

使用道具 举报

该用户从未签到

1

主题

37

回帖

131

积分

注册会员

积分
131
发表于 2023-5-19 12:50:06 | 显示全部楼层
dong97512 发表于 2023-5-17 13:03
梁工,你好! 电机运作程序中,对PWMB_CCER2   不停的设置,是不是也会影响到PWM8  做PWM独立输出的正常 ...

图片复制不进去,点击图片窗口,需要啥链接!

点评

回复评论处点高级模式,可以上传图片  详情 回复 发表于 2023-5-19 13:25
回复 支持 反对 送花

使用道具 举报

  • TA的每日心情
    开心
    3 天前
  • 签到天数: 76 天

    [LV.6]常住居民II

    9

    主题

    170

    回帖

    1673

    积分

    版主

    积分
    1673
    发表于 2023-5-19 13:25:56 | 显示全部楼层
    dong97512 发表于 2023-5-19 12:50
    图片复制不进去,点击图片窗口,需要啥链接!

    回复评论处点高级模式,可以上传图片
    Z9E9GIEO0{G6V843CTJX1RX.png
    P4OSE(N56[[_2EAUQY5O3QP.png
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    9 分钟前
  • 签到天数: 153 天

    [LV.7]常住居民III

    17

    主题

    370

    回帖

    1285

    积分

    荣誉版主

    积分
    1285
    发表于 2023-5-22 09:21:40 | 显示全部楼层
    请教PWMB_SMCR   = 0x60;语句的作用。
    应该是PWMB_SMCR   = 0x06;

    //========================================================================
    // 函数: void PWMB_config(void)
    // 描述: PPWM配置函数。
    // 参数: noe.
    // 返回: none.
    // 版本: V1.0, 2021-5-10
    // 备注:
    //========================================================================
    void PWMB_config(void)
    {
            P_SW2 |= 0x80;                //SFR enable   

            PWMB_PSCR = 11;        // 预分频寄存器, 分频 Fck_cnt = Fck_psc/(PSCR[15:0]+1), 边沿对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)), 中央对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)*2).
            PWMB_DTR  = 0;        // 死区时间配置, n=0~127: DTR= n T,   0x80 ~(0x80+n), n=0~63: DTR=(64+n)*2T,  
                                            //                                0xc0 ~(0xc0+n), n=0~31: DTR=(32+n)*8T,   0xE0 ~(0xE0+n), n=0~31: DTR=(32+n)*16T,
            PWMB_CCER1  = 0;
            PWMB_CCER2  = 0;
            PWMB_CR1    = 0;                // 使能计数器, 允许自动重装载寄存器缓冲, 边沿对齐模式, 向上计数,  bit7=1:写自动重装载寄存器缓冲(本周期不会被打扰), =0:直接写自动重装载寄存器本(周期可能会乱掉)
            PWMB_CR2    = 0;
            PWMB_SR1    = 0;
            PWMB_SR2    = 0;
            PWMB_ENO    = 0;        //IO禁止输出PWM,  bit6: ENO8P, bit4: ENO7P,  bit2: ENO5P,  bit0: ENO4P
            PWMB_PS     = 0;
            PWMB_IER    = 0;

            PWMB_CCMR1  = 0x31;                // 通道5模式配置, 配置成输入通道, 8个时钟滤波
    //        PWMB_CCER1 |= (0x01+0x02);        // 0x01:允许输入捕获, +0x00:上升沿, +0x02:下降沿
            PWMB_PS    |= 0;                // 选择IO, 0:选择P2.0, 1:选择P1.7, 2:选择P0.0, 3:选择P7.4,
    //        PWMB_IER   |= 0x02;                // 使能中断

            PWMB_CCMR2  = 0x31;                // 通道6模式配置, 配置成输入通道, 8个时钟滤波
    //        PWMB_CCER1 |= (0x10+0x20);        // 0x10:允许输入捕获, +0x00:上升沿, +0x20:下降沿
            PWMB_PS    |= (0<<2);        // 0:选择P2.1, 1:选择P5.4, 2:选择P0.1, 3:选择P7.5,
    //        PWMB_IER   |= 0x04;                // 使能中断

            PWMB_CCMR3  = 0x31;                // 通道7模式配置, 配置成输入通道, 8个时钟滤波
    //        PWMB_CCER2 |= (0x01+0x02);        // 0x01:允许输入捕获, +0x00:上升沿, +0x02:下降沿
            PWMB_PS    |= (0<<4);        // 选择IO, 0:选择P2.2, 1:选择P3.3, 2:选择P0.2, 3:选择P7.6,
    //        PWMB_IER   |= 0x08;                // 使能中断

            PWMB_EGR    = 0x01;                //产生一次更新事件, 清除计数器和预分频计数器, 装载预分频寄存器的值
            PWMB_SMCR   = 0x60;
            PWMB_BKR    = 0x00;                //主输出使能 相当于总开关
            PWMB_CR1   |= 0x01;                // 使能计数器, 允许自动重装载寄存器缓冲, 边沿对齐模式, 向上计数,  bit7=1:写自动重装载寄存器缓冲(本周期不会被打扰), =0:直接写自动重装载寄存器本(周期可能会乱掉)

    //        P2n_standard(0x07);        //通道5 6 7输出IO设置为准双向口
    }

    考虑到代码运行ok,说明该语句可以删除不用。

    点评

    SMCR是从模式寄存器,你给的是0x60,即最高位为0,所以给的值没有作用,等于没有这一句。  详情 回复 发表于 2023-5-22 10:20
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    45

    主题

    2914

    回帖

    6550

    积分

    超级版主

    积分
    6550
     楼主| 发表于 2023-5-22 10:20:01 | 显示全部楼层
    社区闲人 发表于 2023-5-22 09:21
    请教PWMB_SMCR   = 0x60;语句的作用。
    应该是PWMB_SMCR   = 0x06;

    SMCR是从模式寄存器,你给的是0x60,即最高位为0,所以给的值没有作用,等于没有这一句。
    1.png

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    9 分钟前
  • 签到天数: 153 天

    [LV.7]常住居民III

    17

    主题

    370

    回帖

    1285

    积分

    荣誉版主

    积分
    1285
    发表于 2023-5-22 10:35:44 | 显示全部楼层
    梁工 发表于 2023-5-22 10:20
    SMCR是从模式寄存器,你给的是0x60,即最高位为0,所以给的值没有作用,等于没有这一句。

    再请教一下,捕获脉冲宽度的例程中PWMB_SMCR   = 0x54;

    为什么bit7位为0?

    点评

    哪里的例子?我的例子没有操作SMCR寄存器: void PWMB_config(void) { P_SW2 |= 0x80; //SFR enable PWMB_CCER1 = 0; PWMB_CCER2 = 0; PWMB_SR1 = 0; PWMB_SR2 = 0; PWMB_ENO = 0; //IO禁止输  详情 回复 发表于 2023-5-22 22:34
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    1

    主题

    37

    回帖

    131

    积分

    注册会员

    积分
    131
    发表于 2023-5-22 18:58:56 | 显示全部楼层
    梁工 发表于 2023-5-12 10:51
    1、请参考下面的连接里的程序,PWMB的程序。
    2、你应该是过冲了,机械系统有惯性的,用PID,或者少用P(比 ...

    梁工,你好!目前我输入工控0-10伏,单片机AD口是0-4伏,设置0伏为0档, 4伏为54档,转动电位器采样:电位器位置采样0.44-4.78 V, 0.44伏与对应0 档, 4.78位置对应54 挡位,目前猛改变工控0-10伏,电位器旋转头和尾看着正常,慢慢变化工控0-10伏, 电位器旋转头和尾 的位置会出现不到位的问题。改如何改进?
                             
                            if(!B_RUN && (PWW_Set >= 2))// &&( I_MAX==0 ))                // PWM_Set >= 30, 并且电机未运行, 则启动电机 30  16
                            {
                                    PWM_Value = 30;                        //启动电机的最低PWM, 根据具体电机而定
                                    PWMA_CCR1L = PWM_Value;        //输出PWM
                                    PWMA_CCR2L = PWM_Value;
                                    PWMA_CCR3L = PWM_Value;
                                    B_RUN = 1;                //标注运行
                                    StepMotor();        //启动换相
                                    //  POWER_WORK=0;
                            }

    点评

    是否将ADC输入端设置为高阻了?必须设置为高阻。 电位器调到0,应该是0V,如果没有到0V(或非常接近0V),则是电位器的问题,因为ADC是输入,电压由电位器提供。  详情 回复 发表于 2023-5-22 22:31
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    1

    主题

    37

    回帖

    131

    积分

    注册会员

    积分
    131
    发表于 2023-5-22 21:35:33 | 显示全部楼层
    一轮明月 发表于 2023-5-19 13:25
    回复评论处点高级模式,可以上传图片


    目前就想了解,这种尖峰能否克服。


    微信图片_20230519112034.jpg 微信图片_20230519112015.jpg
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-4-28 05:33 , Processed in 0.081278 second(s), 74 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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