📄 main.c
字号:
//-----------------------------------------------------------------
// 名称: 带位置感应器的直流无刷电机PMW控制仿真
//-----------------------------------------------------------------
// 说明: 本例用PIC单片机控制带感应器的直流无刷电机,通过调节RA0端口的
// 可变电阻器可实现电机调速控制.
// 由于当前版本PROTEUS不支持换向功能,连接RA1端口的SW1尚不能控制
// 无刷电机的运行方向.
//
//-----------------------------------------------------------------
#include <pic.h>
#define INT8U unsigned char
#define INT16U unsigned int
#define _XTAL_FREQ 20000000UL //20MHz
#define BLDC_StopMask 0B11010101 //关闭电机的掩码(高边设为全0)
#define BLDC_DrivePort PORTC //无刷直流电机驱动方向控制端口(6位)
#define BLDC_DrivePortTris TRISC //无刷直流电机驱动方向控制端口方向设置
#define BLDC_Direction RA1 //无刷直流电机当前方向检测位
#define BLDC_SensorPORT PORTE //无刷直流电机感应器输入端口
#define BLDC_SensorTRIS TRISE //无刷直流电机感应器输入端口方向寄存器
volatile INT8U ADC_Result; //控制PWM的AN0通道A/D转换数据
volatile INT8U DriveByte; //电机驱动字节(低6位有效)
//-----------------------------------------------------------------
// 驱动表设置(更详细说明可参阅本书相关章节)
//-----------------------------------------------------------------
//1.6个驱动器共为3对,每2个为一对
//2.每一对驱动线由一个高边和一个低边构成
//3.三个驱动器对应于三个电机绕组A,B,C
//4.绕组 A 由RC[1..0]两位驱动,其中RC1是 A 绕组的高边
//5.绕组 B 由RC[3..2]两位驱动,其中RC3是 B 绕组的高边
//6.绕组 C 由RC[5..4]两位驱动,其中RC5是 C 绕组的高边
//7.三个感应器位构成了驱动表的偏移地址,感应器位[0..2]分别对应于绕组A,B,C
//正向驱动数据表,第1-6字节对应于相位6,4,5,2,1,3的驱动位,各字节中仅低6位有效
//驱动表中第0,7两字节无效
const INT8U FwdTable[] = {0B00000000,0B00010010,0B00001001,0B00011000,
0B00100100,0B00000110,0B00100001,0B00000000};
//反向驱动数据表,第1-6字节对应于相位/6,/4,/5,/2,/1,/3的驱动位,0,7两字节无效
//表中每个字节后6位中,相邻两位为一组,与上表的差别是每组中的两位颠倒
const INT8U RevTable[] = {0B00000000,0B00100001,0B00000110,0B00100100,
0B00011000,0B00001001,0B00010010,0B00000000};
//-----------------------------------------------------------------
// 换向控制
//-----------------------------------------------------------------
void Get_Drive_Byte()
{
//读取PORTE端口输入的感应器当前数据(三位)
//根据RA1端口的方向位及当前位置感应器输出,从正向或反向驱动表中读取驱动字节
}
//-----------------------------------------------------------------
// 初始化程序
//-----------------------------------------------------------------
void Initialize()
{
}
//-----------------------------------------------------------------
// 读取A/D转换结果的高8位
//-----------------------------------------------------------------
void ReadADC()
{
}
//-----------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------
void main()
{
Initialize();
while (1)
{
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -