一个关于电机的霍尔传感器的子程序看不懂。(别人写的)求教!!
/* This file has been prepared for Doxygen automatic documentation generation.*//******************************************************************************/
//! \name Output pins to drive stages.
#define ULPB0
#define VLPB6
#define WLPB7
#define UHPD5
#define VHPD6
#define WHPD7
#define MC_MASK ((0<<UL)|(0<<VL)|(0<<WL)|(1<<UH)|(1<<VH)|(1<<WH))
//! \name Hall sensor input pins.
//@{
#define HALL1 0 // PB3
#define HALL2 1 //PB4
#define HALL3 2 //PB5
#define HALL_MASK((1<<HALL1)|(1<<HALL2)|(1<<HALL3))
#define HP1 ((0<<HALL1)|(1<<HALL2)|(0<<HALL3)) //5
#define HP2 ((0<<HALL1)|(1<<HALL2)|(1<<HALL3)) //4
#define HP3 ((0<<HALL1)|(0<<HALL2)|(1<<HALL3)) //6
#define HP4 ((1<<HALL1)|(0<<HALL2)|(1<<HALL3)) //2
#define HP5 ((1<<HALL1)|(0<<HALL2)|(0<<HALL3)) //3
#define HP6 ((1<<HALL1)|(1<<HALL2)|(0<<HALL3)) //1
//20070728
#define PDP1_CW((1<<UH)|(1<<VH)|(0<<WH))
#define PDP2_CW((1<<UH)|(0<<VH)|(1<<WH))
#define PDP3_CW((1<<UH)|(0<<VH)|(1<<WH))
#define PDP4_CW((0<<UH)|(1<<VH)|(1<<WH))
#define PDP5_CW((1<<UH)|(1<<VH)|(0<<WH))
#define PDP6_CW((0<<UH)|(1<<VH)|(1<<WH))
#define PDP_stop((1<<UH)|(1<<VH)|(1<<WH))
#define PBP1_CW((0<<UL)|(1<<VL)|(1<<WL))
#define PBP2_CW((1<<UL)|(1<<VL)|(0<<WL))
#define PBP3_CW((0<<UL)|(1<<VL)|(1<<WL))
#define PBP4_CW((1<<UL)|(0<<VL)|(1<<WL))
#define PBP5_CW((1<<UL)|(0<<VL)|(1<<WL))
#define PBP6_CW((1<<UL)|(1<<VL)|(0<<WL))
#define PBP_stop((1<<UL)|(1<<VL)|(1<<WL))
#define PDP1_ANCW((0<<UH)|(1<<VH)|(1<<WH))
#define PDP2_ANCW((1<<UH)|(0<<VH)|(1<<WH))
#define PDP3_ANCW((1<<UH)|(0<<VH)|(1<<WH))
#define PDP4_ANCW((1<<UH)|(1<<VH)|(0<<WH))
#define PDP5_ANCW((0<<UH)|(1<<VH)|(1<<WH))
#define PDP6_ANCW((1<<UH)|(1<<VH)|(0<<WH))
#define PBP1_ANCW((1<<UL)|(1<<VL)|(0<<WL))
#define PBP2_ANCW((0<<UL)|(1<<VL)|(1<<WL))
#define PBP3_ANCW((1<<UL)|(1<<VL)|(0<<WL))
#define PBP4_ANCW((1<<UL)|(0<<VL)|(1<<WL))
#define PBP5_ANCW((1<<UL)|(0<<VL)|(1<<WL))
#define PBP6_ANCW((0<<UL)|(1<<VL)|(1<<WL))
const unsigned char HAll_CW[] = {
0,
3, // ((1<<HALL1)|(0<<HALL2)|(1<<HALL3))
6, //((1<<HALL1)|(0<<HALL2)|(0<<HALL3))
2, //((1<<HALL1)|(1<<HALL2)|(0<<HALL3))
5, //((0<<HALL1)|(1<<HALL2)|(0<<HALL3))
1, //((0<<HALL1)|(1<<HALL2)|(1<<HALL3))
4, //((0<<HALL1)|(0<<HALL2)|(1<<HALL3))
7,
};
//b
const unsigned char PDP_CW[] = {
// MC_PORT drive config
PDP_stop,
PDP5_CW, // ((0<<UH)|(1<<VH)|(0<<WH))
PDP6_CW, // ((1<<UH)|(0<<VH)|(0<<WH))
PDP4_CW, // ((1<<UH)|(0<<VH)|(0<<WH))
PDP3_CW, // ((0<<UH)|(0<<VH)|(1<<WH))
PDP1_CW, // ((0<<UH)|(1<<VH)|(0<<WH))
PDP2_CW, // ((0<<UH)|(0<<VH)|(1<<WH))
PDP_stop, // ((1<<UH)|(1<<VH)|(1<<WH))
};
const unsigned char PBP_CW[] = {
// MC_PORT drive config
PBP_stop,
PBP5_CW, // ((1<<UL)|(1<<VL)|(0<<WL))
PBP6_CW, // ((1<<UL)|(0<<VL)|(1<<WL))
PBP4_CW, // ((1<<UL)|(1<<VL)|(0<<WL))
PBP3_CW, // ((0<<UL)|(1<<VL)|(1<<WL))
PBP1_CW, // ((0<<UL)|(1<<VL)|(1<<WL))
PBP2_CW, // ((1<<UL)|(0<<VL)|(1<<WL))
PBP_stop, // ((0<<UL)|(0<<VL)|(0<<WL))
};
//-----------------------------------------------------------------
const unsigned char HAll_ANCW[] = {
0,
5, //((0<<HALL1)|(0<<HALL2)|(1<<HALL3))
3, // ((1<<HALL1)|(0<<HALL2)|(1<<HALL3))
1, //((1<<HALL1)|(0<<HALL2)|(0<<HALL3))
6, //((1<<HALL1)|(1<<HALL2)|(0<<HALL3))
4, //((0<<HALL1)|(1<<HALL2)|(0<<HALL3))
2, //((0<<HALL1)|(1<<HALL2)|(1<<HALL3))
7,
};
//b
const unsigned char PDP_ANCW[] = {
// MC_PORT drive config
PDP_stop,
PDP3_ANCW,
PDP6_ANCW,
PDP2_ANCW,
PDP5_ANCW,
PDP1_ANCW,
PDP4_ANCW,
PDP_stop,
};
const unsigned char PBP_ANCW[] = {
// MC_PORT drive config
PBP_stop,
PBP3_ANCW,
PBP6_ANCW,
PBP2_ANCW,
PBP5_ANCW,
PBP1_ANCW,
PBP4_ANCW,
PBP_stop, // ((0<<UL)|(0<<VL)|(0<<WL))
}; 谢谢分享了,了解一下 1,定义上下桥臂的6路IO;
2,定义HALL传感器的IO接口;
3,定义6个HALL状态;
4,定义3个上桥臂在正转时、6个HALL状态下IO口输出的电平;
5,定义3个下桥臂在正转时、6个HALL状态下IO口输出的电平;
6,定义3个上桥臂在反转时、6个HALL状态下IO口输出的电平;
7,定义3个下桥臂在反转时、6个HALL状态下IO口输出的电平;
8,构建电机正转HALL表;
9,构建电机正转上桥臂输出的6个状态;
10,构建电机正转下桥臂输出的6个状态;
11,构建电机反转HALL表;
12,构建电机反转上桥臂输出的6个状态;
13,构建电机反转下桥臂输出的6个状态;
14,程序仿真时,发现表中的数据有溢出的情况,不能确定是作者本来的意图,还是疏忽,最好是配上单片机资料和原理图才能明白。 学习一下,多谢分享 回复 3# 179361311
非常感谢版主的细心解答。我大致了解了,但还有几个细节请问一下版主:
1,#define MC_MASK ((0<<UL)|(0<<VL)|(0<<WL)|(1<<UH)|(1<<VH)|(1<<WH)) ,#define HALL_MASK((1<<HALL1)|(1<<HALL2)|(1<<HALL3))
这究竟要表达一个什么意思?
2,#define HALL1 0 // PB3
#define HALL2 1 //PB4
#define HALL3 2 //PB5
这个HALL得IO口怎么定义成了0、1、2,这与PB3、4、5有何关系么?
3, 再有后面的有些解释总感觉怪怪的,看不太懂。
4,用的是M48单片机。控制直流无刷电机的。 回复 3# 179361311
例如像这个电机正转HALL表后面的解释总感觉和前面定义有冲突啊
const unsigned char HAll_CW[] = {
0,
3, // ((1<<HALL1)|(0<<HALL2)|(1<<HALL3))
6, //((1<<HALL1)|(0<<HALL2)|(0<<HALL3))
2, //((1<<HALL1)|(1<<HALL2)|(0<<HALL3))
5, //((0<<HALL1)|(1<<HALL2)|(0<<HALL3))
1, //((0<<HALL1)|(1<<HALL2)|(1<<HALL3))
4, //((0<<HALL1)|(0<<HALL2)|(1<<HALL3))
7,
}; 现在公司也准备搞电机,控制器正是头痛啊 看别人的程序要自已优化一下哦 回复 5# diandongji
关于1:#define (定义) MC_MASK (等于)((0<<UL)|(0<<VL)|(0<<WL)|(1<<UH)|(1<<VH)|(1<<WH))(UWV 移位后按位相加)
关于2:PB5PB4PB3 与2 1 0没有直接对应关系 很多软件都是把物理量 转换成数字量,再进行处理 很高深的东西 这个搞不懂,太复杂了 呵呵,我没有具体看你程序,但是大概看了一眼,和我现在做的差不多。其实他是利用三路霍尔信号,来确定转子位置,通过三路霍尔信号的六种组合,讲360度角度6等份。通过读取当前霍尔信号的值以及上次的霍尔信号值,来确定当前的电机转向和转速。希望对你有帮助 太夸张了 写这么复杂,一个数组完成的事情··· 学习一下,多谢分享 学习,多谢分享
页:
[1]