pic pwm 占空比可调 源码_PIC单片机PWM电机速度控制源码

本文提供了一段使用PIC单片机进行PWM电机速度控制的源码,包括了OSCillator初始化、端口方向设置、TMR1和TMR3定时器配置以及中断服务函数等关键步骤。通过调节PWM占空比来调整电机转速。
摘要由CSDN通过智能技术生成

单片机源程序如下:

#include

#include "16x2LCDDriver.h"

unsigned char LCDBuffer_0[]={"STOP 00% DIR +"};

unsigned char LCDBuffer_1[]={"Get Spd 0000 RPM"};

struct TMR1COUNTER_STRUCT

{

unsigned char HighCounter;

unsigned int LowCounter;

unsigned char ChangeFlag;

};

struct TMR1COUNTER_STRUCT MyTMR1,MyTMR3,GetTMR1,GetTMR3;

void OSCillator_Initize(void)

{

OSCCON=0x70;//选择内部8MHz的主振荡器

OSCTUNE=0x40;//使能4xPLL--->Fosc=32MHz

}

void PIC_PortDir_Initize(void)

{

ADCON1=0x0F;//RA和RE端口全为数字IO口

TRISD=0x00;//RD端口置输出方向

TRISE=0x00;//RE端口置输出方向

TRISCbits.TRISC1=0;

TRISCbits.TRISC2=0;

TRISCbits.TRISC3=0;

}

void PIC_TMR0_Initize(void)

{

T0CONbits.TMR0ON=0;//TMR0停止工作

T0CONbits.T08BIT=0;//选择16位的定时/计数器

T0CONbits.T0CS=0;//选择内部CLKO时钟源作为定时

T0CONbits.PSA=0;//选择预分频器

T0CONbits.T0PS2=1;//预分频比为1:256

T0CONbits.T0PS1=1;

T0CONbits.T0PS0=1;

TMR0H=(65536-31250)/256;//先写高字节

TMR0L=(65536-31250)%256;//再写低字节

T0CONbits.TMR0ON=1;//开始定时工作

}

void PIC_TMR1_Initize(void)

{

//此处TMR1的预分频比为1:1

T1CONbits.RD16=1;//允许一次性读写16位

T1CONbits.TMR1CS=1;//选择外部时钟源,TMR1用作外部计数

TMR1H=0;//TMR1数据寄存器清0

TMR1L=0;

T1CONbits.TMR1ON=1;//允许TMR1开始工作

}

void PIC_TMR3_Initize(void)

{

//此处TMR1的预分频比为1:8

T3CONbits.T3CKPS1=1;

T3CONbits.T3CKPS0=1;

T3CONbits.RD16=1;//允许一次性读写16位

T3CONbits.TMR3CS=0;//选择内部时钟源,TMR3用作内部计数

TMR3H=0;//TMR3数据寄存器清0

TMR3L=0;

T3CONbits.TMR3ON=1;//允许TMR3开始工作

}

void PIC_Interrupt_Initize(void)

{

INTCONbits.TMR0IF=0;//TMR0溢出标志位清0

INTCONbits.TMR0IE=1;//TMR0溢出中断允许

PIR1bits.TMR1IF=0;//TMR1溢出标志位清0

PIE1bits.TMR1IE=1;//TMR1溢出中断允许

IPR1bits.TMR1IP=0;//低优先级

PIR2bits.TMR3IF=0;//TMR1溢出标志位清0

PIE2bits.TMR3IE=1;//TMR1溢出中断允许

IPR2bits.TMR3IP=0;//低优先级

INTCONbits.INT0IF=0;//清INT0中断标志位

//INTCONbits.INT0IE=1;//INT0中断允许

INTCON2bits.RBPU=0;//允许内部弱上拉

INTCON2bits.INTEDG0=1;//上边沿触发中断

RCONbits.IPEN=1;//允许中断优先级位

INTCONbits.GIE=1;//CPU全局中断使能允许

INTCONbits.PEIE=1;//CPU第二梯队中断使能允许

}

void PIC_CCPForPWM_Initize(void)

{

TRISCbits.TRISC1=0;//RC1置输出方向

TRISCbits.TRISC2=0;//RC2置输出方向

LATCbits.LATC1=0;//RC1引脚输出为0

LATCbits.LATC2=0;//RC2引脚输出为0

CCP1CON=0x0F;//CCP1设置为PWM模式

CCP2CON=0x0F;//CCP2设置为PWM模式

T2CON=0x03;//TMR2的预分频为1:16

T2CONbits.TMR2ON=1;//TMR2开始工作

PR2=249;//PWM周期为2000Hz,FOSC=32MHz

CCPR1L=0;//PWM1的占空比为0

CCPR2L=0;//PWM2的占空比为0

}

unsigned char CycleFlag;

unsigned char FreqFlag;

#define RUNSTOPKEY PORTBbits.RB3

#define PWMKEY PORTBbits.RB4

#define DIRKEY PORTBbits.RB5

unsigned char MotorRunStatus;

unsigned char MotorDirection;

unsigned char MotorPWMData;

unsigned char RunStopKeyFlag;

unsigned int RunStopKeyCounter;

unsigned char DirKeyFlag;

unsigned int DirKeyCounter;

unsigned char PWMKeyFlag;

unsigned int PWMKeyCounter;

void SystemVariant_Initize(void)

{

MotorPWMData=0;

}

void Motor_Control(unsigned char Direction,

unsigned char Speed)

{

switch(Direction)

{

case 0:

CCPR1L=0;

CCPR2L=0;

CCPR1L=Speed;

break;

case 1:

CCPR2L=0;

CCPR1L=0;

CCPR2L=Speed;

break;

}

}

//-------------------------------------------------------------------

void PIC18F_High_isr(void);//高优先级中断函数声明

#pragma code high_vector_section=0x8

void high_vector (void)

{

_asm goto PIC18F_High_isr _endasm

}

void SystemInterruptISR(void);//低优先级中断函数声明

#pragma code low_vector=0x18//低中断优先级

void low_interrupt(void)

{

_asm goto SystemInterruptISR _endasm

}

#pragma code

//-------------------------------------------------------------------

void main(void)

{

unsigned long temp;

unsigned char i;

OSCillator_Initize();//CPU系统时钟初始化内部时钟源8MHz,经过4xPLL

PIC_PortDir_Initize();//PIC单片机的使用到的I/O口方向初始化

PIC_TMR0_Initize();//PIC单片机的TMR0定时器初始化为内部定时方式

PIC_TMR1_Initize();//PIC单片机的TMR1定时器初始化为外部计数方式

PIC_TMR3_Initize();

PIC_CCPForPWM_Initize();

PIC_Interrupt_Initize();

initize_lcd();

while(1)

{

if(0==RUNSTOPKEY)//判断启动按键是否按下

{

if(0==RunStopKeyFlag)//检测启动按键是否成功按下标志

{

RunStopKeyCounter++;//软件计数器,用于按键去抖动

if(4000==RunStopKeyCounter)//按键去抖动延时到

{

RunStopKeyCounter=0;//清软计数器为0

if(0==RUNSTOPKEY)//再判断启动按键是否真得按下

{

RunStopKeyFlag=1;//置启动按键成功按下标志为1

if(0==MotorRunStatus)//如果电机是处理停止状态

{//则启动电机运转

MotorRunStatus=1;//同时置电机状态为1

LCDBuffer_0[0]='R';//LCD显示屏上显示"RUN"

LCDBuffer_0[1]='U';

LCDBuffer_0[2]='N';

LCDBuffer_0[3]=' ';

LCDBuffer_0[4]=' ';

temp=MotorPWMData;//读取设置电机速度的变量

temp<<=1;//转换成占空比送到LCD上显示

temp/=5;

LCDBuffer_0[5]=(temp/10)+0x30;

LCDBuffer_0[6]=(temp%10)+0x30;

LCDBuffer_0[7]='%';

LCDBuffer_0

[1] [2] [3] [4] [5]

关键字:PIC单片机  PWM电机  速度控制

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic478293.html

本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值