⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 单片机c语言程序设计100例--基于PIC+PROTEUS
💻 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 + -