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

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

[复制链接]

该用户从未签到

46

主题

2979

回帖

6713

积分

超级版主

积分
6713
 楼主| 发表于 2023-5-22 22:31:37 | 显示全部楼层
dong97512 发表于 2023-5-22 18:58
梁工,你好!目前我输入工控0-10伏,单片机AD口是0-4伏,设置0伏为0档, 4伏为54档,转动电位器采样:电 ...

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

使用道具 举报

该用户从未签到

46

主题

2979

回帖

6713

积分

超级版主

积分
6713
 楼主| 发表于 2023-5-22 22:34:42 | 显示全部楼层
社区闲人 发表于 2023-5-22 10:35
再请教一下,捕获脉冲宽度的例程中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禁止输出PWM,  bit6: ENO8P, bit4: ENO7P,  bit2: ENO5P,  bit0: ENO4P
        PWMB_PS     = 0;
        PWMB_IER    = 0;
        PWMB_ISR_En = 0;

        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_CCMR1   = 0x01;        // CC1配置为输入模式, 且映射到TI1FP1上
        PWMB_CCER1  |= 0x01;        // 配置捕获极性为CC1的上升沿, 使能捕获, 0x01:上升沿, 0x03:下降沿
        PWMB_CCMR2   = 0x02;        // CC2配置为输入模式, 且映射到TI1FP2上
        PWMB_CCER1  |= 0x30;        // 配置捕获极性为CC2的下降沿, 使能捕获, 0x10:上升沿, 0x30:下降沿
        PWMB_PS     |= 0;                // 选择IO, 0:选择P2.0, 1:选择P1.7, 2:选择P0.0, 3:选择P7.4,
        PWMB_ISR_En |= 0x02;        // 使能CC1中断
        PWMB_ISR_En |= 0x04;        // 使能CC2中断
        P2n_standard(Pin0);                // P2.0设置为准双向口
        P20 = 1;

        PWMB_CCMR3   = 0x01;        // CC3配置为输入模式, 且映射到TI3FP3上
        PWMB_CCER2  |= 0x01;        // 配置捕获极性为CC3的上升沿, 使能捕获, 0x01:上升沿, 0x03:下降沿
        PWMB_CCMR4   = 0x02;        // CC2配置为输入模式, 且映射到TI3FP4上
        PWMB_CCER2  |= 0x30;        // 配置捕获极性为CC4的下降沿, 使能捕获, 0x10:上升沿, 0x30:下降沿
        PWMB_PS     |= (0<<4);        // 选择IO, 0:选择P2.2, 1:选择P3.3, 2:选择P0.2, 3:选择P7.6,
        PWMB_ISR_En |= 0x08;        // 使能CC3中断
        PWMB_ISR_En |= 0x10;        // 使能CC4中断
        P2n_standard(Pin2);                // P2.2设置为准双向口
        P22 = 1;

        PWMB_IER  = PWMB_ISR_En;        //设置标志允许通道1~4中断处理
        PWMB_CR1 |= 0x01;                // 使能计数器, 允许自动重装载寄存器缓冲, 边沿对齐模式, 向上计数,  bit7=1:写自动重装载寄存器缓冲(本周期不会被打扰), =0:直接写自动重装载寄存器本(周期可能会乱掉)
}
回复 支持 反对 送花

使用道具 举报

该用户从未签到

1

主题

37

回帖

131

积分

注册会员

积分
131
发表于 2023-5-23 22:25:32 | 显示全部楼层
梁工 发表于 2023-5-22 22:31
是否将ADC输入端设置为高阻了?必须设置为高阻。
电位器调到0,应该是0V,如果没有到0V(或非常接近0V) ...

仔细查看过,AD, 输入引脚都设为高输入状态,具体为何状态电位器快到2端位置(估计是1档或者53档,万用表测试电压推断)会出现停顿问题还没有找错原因。想再请教一下,这个电机转动圈数可以如何计算,我可以再输入0或者10伏档时,状态电位器在1档或者53档位的时候, 强行再给它工作几圈,就能到位了,这个圈数能计数就可行了。是吧?谢谢梁工了!就差一步了,这个项目应该就算完成了。

点评

从霍尔信号中可以知道转速信号,换相次数就可以知道转了多少角度。 你可以断开电位器,用电流表测量ADC输入对GND和对Vref的电流,这个电流小于1uA就设置对了(通常会小于0.1A)。  详情 回复 发表于 2023-5-24 11:12
回复 支持 反对 送花

使用道具 举报

该用户从未签到

46

主题

2979

回帖

6713

积分

超级版主

积分
6713
 楼主| 发表于 2023-5-24 11:12:37 | 显示全部楼层
dong97512 发表于 2023-5-23 22:25
仔细查看过,AD, 输入引脚都设为高输入状态,具体为何状态电位器快到2端位置(估计是1档或者53档,万用表 ...

从霍尔信号中可以知道转速信号,换相次数就可以知道转了多少角度。
你可以断开电位器,用电流表测量ADC输入对GND和对Vref的电流,这个电流小于1uA就设置对了(通常会小于0.1A)。
回复 支持 反对 送花

使用道具 举报

该用户从未签到

1

主题

37

回帖

131

积分

注册会员

积分
131
发表于 2023-5-25 10:44:46 | 显示全部楼层
dong97512 发表于 2023-5-23 22:25
仔细查看过,AD, 输入引脚都设为高输入状态,具体为何状态电位器快到2端位置(估计是1档或者53档,万用表 ...

电位器位置修正值就正常了,理论计算偏差。  还想请教一下,电机运作圈数, 应该好计数吧,通过霍尔3个检测脚都运作一次,加一圈,,这样合理吗?非常感谢!
回复 支持 反对 送花

使用道具 举报

该用户从未签到

3

主题

25

回帖

173

积分

注册会员

积分
173
发表于 2023-5-26 16:19:14 | 显示全部楼层
梁工,
刚启动后,第一次进入ADC中断,要累计8次才可以求平均值,开始前7次,次数不够,算下来平均时间会不会乱?

PhaseTimeTmp[TimeIndex] = PhaseTime;        //保存一次换相时间
                if(++TimeIndex >= 8)        TimeIndex = 0;        //累加8次
                for(PhaseTime=0, i=0; i<8; i++)        PhaseTime += PhaseTimeTmp[i];        //求8次换相时间累加和
                PhaseTime = PhaseTime >> 4;                // >>4 = 值/16 ,求8次换相时间的平均值的一半, 即30度电角度

点评

不会乱的,开始给有初值,并且开始低速,电流不大,有点误差影响不大,并且8次切换那是瞬间就可以完成的,大部分电机切换8次都还没转半圈呢。 我2015年的版本是没有30度角处理的(使用STC15W408AS),只是效率没那么  详情 回复 发表于 2023-5-26 21:48
回复 支持 反对 送花

使用道具 举报

该用户从未签到

46

主题

2979

回帖

6713

积分

超级版主

积分
6713
 楼主| 发表于 2023-5-26 21:48:25 | 显示全部楼层
fisholive 发表于 2023-5-26 16:19
梁工,
刚启动后,第一次进入ADC中断,要累计8次才可以求平均值,开始前7次,次数不够,算下来平均时间会不 ...

不会乱的,开始给有初值,并且开始低速,电流不大,有点误差影响不大,并且8次切换那是瞬间就可以完成的,大部分电机切换8次都还没转半圈呢。
我2015年的版本是没有30度角处理的(使用STC15W408AS),只是效率没那么高,力矩稍小。
回复 支持 反对 送花

使用道具 举报

该用户从未签到

1

主题

37

回帖

131

积分

注册会员

积分
131
发表于 2023-5-29 13:01:53 | 显示全部楼层
梁工,我手上一款电机样品,正转电流正常,反转电流越转越大,不正常的大,电机公司提供的测试板是专业电机驱动板,正反转确实正常,这种现象如何理解,电机公司还是认可自己的产品没问题。

点评

换相时序不对,双踪示波器(最好是四踪)看一下波形。  详情 回复 发表于 2023-5-29 14:01
回复 支持 反对 送花

使用道具 举报

该用户从未签到

46

主题

2979

回帖

6713

积分

超级版主

积分
6713
 楼主| 发表于 2023-5-29 14:01:44 | 显示全部楼层
dong97512 发表于 2023-5-29 13:01
梁工,我手上一款电机样品,正转电流正常,反转电流越转越大,不正常的大,电机公司提供的测试板是专业电机 ...

换相时序不对,双踪示波器(最好是四踪)看一下波形。
回复 支持 反对 送花

使用道具 举报

该用户从未签到

1

主题

37

回帖

131

积分

注册会员

积分
131
发表于 2023-6-10 23:10:20 | 显示全部楼层
梁工 发表于 2023-5-29 14:01
换相时序不对,双踪示波器(最好是四踪)看一下波形。

梁工,你好!我手上有个电机,原来的方案,霍尔数组        {0, 1, 3, 2, 5, 6, 4}, //CWW
    {0, 4, 6, 5, 2, 3, 1}  //CW  ,运转正常。 在目前这个案例的switch(step)里面顺时钟方向 填入132564 ,逆时针填入 231465;或者顺时钟方向 填入132564 ,逆时针填入 465231 , 霍尔和相线怎样配相 都不正常工作,我该如何填入这个顺序才对?谢谢!

点评

土方法是最高级的方法 , 点赞啊!(,用示波器观察3个霍尔信号(双通道就分别观察AB和AC),转动电机,看到霍尔波形时序,就知道如果对应步骤...  发表于 2024-2-23 16:51
我的土方法是,用示波器观察3个霍尔信号(双通道就分别观察AB和AC),转动电机,看到霍尔波形时序,就知道如果对应步骤了。  详情 回复 发表于 2023-6-11 14:26
回复 支持 反对 送花

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-10 03:43 , Processed in 0.068089 second(s), 65 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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