PIC32MX单片机系列之PWM

简介

PIC32MX系列单片机内部集成有输出比较模块,主要用于响应设定时基事件时产生单脉冲信号或者一连串脉冲信号。我的理解是通过定时器设定一个触发条件,输出比较模块匹配后从输出口产生一个电平信号。再通过对相应寄存器的配置,自由设定PWM输出频率及占空比。

初始化

选定OC2引脚作为PWM的信号输出端。

void PWM_Init()
{
    OC2RS = 0;
    OC2R  = 0;
    //OC2CON = 0x8006;
    OC2CONbits.ON = 1; // enable compare module
    OC2CONbits.SIDL = 0; //continue operation when cpu is in IDLE mode
    OC2CONbits.OC32 = 0; // compare module compared with 16 bit timer source
    OC2CONbits.OCFLT = 0; // disabled pwm fault condition
    OC2CONbits.OCTSEL = 0; // choose timer2 for timer source 
    OC2CONbits.OCM = 0x6; // oc1 pin mode is PWM,and PWM fault mode disabled
}

代码主要内容是讲OC2模块设定为PWM模式,选定Timer2作为时钟源,就是简介中时基事件的发生源。

PWM频率设置

频率的设置基于公式,Tpwm = (PR + 1) * Tpb * T(Timer2预分频)
Tpb表示单片机的外设时钟周期。
如 Tpb = 40Mhz , Ttimer2 = 16 , Tpwm = 3Khz
则PR = 832。

void Timer2_Init()
{
	T2CONbits.SIDL = 0;
    T2CONbits.TGATE = 0;
    T2CONbits.TCKPS = 4; // Timer2预分配为1:16
    T2CONbits.T32 = 0;
    T2CONbits.TCS = 0;
    T2CONbits.ON = 1;
	TMR2 = 0x0000;
	PR2 = 832;
	T2CONbits.TON = 1;
}

PWM占空比设置

调节占空比就是设定OC2RS数值与周期数的比列,如下图所示。
在这里插入图片描述

void Pwm_Out(uint32_t pwm_duty)
{
	uint16_t dc;
	
	if(pwm_duty>PWM_DUTY_MAX)
		pwm_duty = PWM_DUTY_MAX;
	
	dc = PWM_DUTY_MAX - pwm_duty;
	
	OC2RS = dc;
}

注:PWM_DUTY_MAX即周期数(PR+1).

输出效果

将OC2引脚接入蜂鸣器,效果如下:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值