PIC单片机-PWM波
一、编写程序,使用RC2的PWM功能生成频率250Hz的正弦波
#include <htc.h>#define uint8 unsigned char
#define uint16 unsigned int__CONFIG(FOSC_HS &WDTE_OFF &BOREN_OFF &PWRTE_OFF &LVP_OFF); //设置配置位
//WDTE_OFF:disable watchdog timer 看门狗禁止
//LVP_OFF:low voltage programming disabled 低电压编程禁止
//FOSC_HS:high speed crystal/resonator 4M以上晶振选择HS高速
//PWRTDIS:disable power up timer
//BOREN_OFF:disable brown out resetuint8 gDutycount = 0;
const char SINETABLE[40] = {50, 55, 60, 65, 70, 75, 80, 85, 90, 95,
100, 95, 90, 85, 80, 75, 70, 65, 60, 55,
50, 45, 40, 35, 30, 25, 20, 15, 10, 5,
0, 5, 10, 15, 20, 25, 30, 35, 40, 45
};/*******************************************************************************
* 函 数 名: PWM_Init(void)
* 函数功能: PWM初始化设置
* 入口参数: 无
* 返 回: 无
*******************************************************************************/void PWM_Init(void)
{
CCPR1L = 0x7F; //初始值,通过调节CCPR1L:CCP1[5:4]的值来达到调节占空比的目的
CCP1CON = CCP1CON | 0x3C; //CCP1[5:4] = 11
TRISC2 = 0; //设置RC2为输出模式
}/*******************************************************************************
* 函 数 名: Time2_Init(void)
* 函数功能: 定时器2初始化
* 入口参数: 无
* 返 回: 无
*******************************************************************************/void Time2_Init(void)
{
T2CON = 0x0C; //启用后分频器,分频比1:2,TIMER2计数允许,前置分频器分频比1:1
PR2 = 255; //正弦波周期为250Hz
TMR2IF = 0; //定时器2中断标志位清零
GIE = 1; //开总中断
PEIE = 1; //开外设中断
TMR2IE = 1; //开定时器中断
}/*******************************************************************************
* 函 数 名: main(void)
* 函数功能: 用PWM输出,调节占空比来调节LED灯的亮度
* 入口参数: 无
* 返 回: 无
*******************************************************************************/
void main(void)
{
PWM_Init();
Time2_Init();
while(1)
{ }
}/******************************************************************************
* 函 数 名: Timer2_ISR(void)
* 函数功能: 中断函数
* 入口参数: 无
* 返 回: 无
*******************************************************************************/void interrupt Timer2_ISR(void)
{
if(TMR2IF)
{ ++gDutycount;
if(gDutycount == 39)
{ gDutycount = 0;
}
CCPR1L = SINETABLE[gDutycount]; // 根据sin表改变PWM波周期
TMR2IF = 0;
}
}
电路接法:
二、编写程序,实现呼吸灯
利用上述程序,动态改变PWM占空比,以实现动态改变LED供给电压的大小,加以适当延时,即可实现呼吸灯。
跳线接法:取下RC2和RD0的短接帽,用杜邦线一头接RC2里面,一头接RD0外面,再短接P14。
#include <htc.h>#define uint8 unsigned char
#define uint16 unsigned int__CONFIG(FOSC_HS &WDTE_OFF &BOREN_OFF &PWRTE_OFF &LVP_OFF); //设置配置位
//WDTE_OFF:disable watchdog timer 看门狗禁止
//LVP_OFF:low voltage programming disabled 低电压编程禁止
//FOSC_HS:high speed crystal/resonator 4M以上晶振选择HS高速
//PWRTDIS:disable power up timer
//BOREN_OFF:disable brown out resetuint8 gDutycount = 0;
uint16 count = 0 ;
const char SINETABLE[40] = {50, 55, 60, 65, 70, 75, 80, 85, 90, 95,
100, 95, 90, 85, 80, 75, 70, 65, 60, 55,
50, 45, 40, 35, 30, 25, 20, 15, 10, 5,
0, 5, 10, 15, 20, 25, 30, 35, 40, 45
};/*******************************************************************************
* 函 数 名: PWM_Init(void)
* 函数功能: PWM初始化设置
* 入口参数: 无
* 返 回: 无
*******************************************************************************/void PWM_Init(void)
{
CCPR1L = 0x7F; //初始值,通过调节CCPR1L:CCP1[5:4]的值来达到调节占空比的目的
CCP1CON = CCP1CON | 0x3C; //CCP1[5:4] = 11
TRISC2 = 0; //设置RC2为输出模式
}/*******************************************************************************
* 函 数 名: Time2_Init(void)
* 函数功能: 定时器2初始化
* 入口参数: 无
* 返 回: 无
*******************************************************************************/void Time2_Init(void)
{
T2CON = 0x0C; //启用后分频器,分频比1:2,TIMER2计数允许,前置分频器分频比1:1
PR2 = 255; //正弦波周期为250Hz
TMR2IF = 0; //定时器2中断标志位清零
GIE = 1; //开总中断
PEIE = 1; //开外设中断
TMR2IE = 1; //开定时器中断
}/*******************************************************************************
* 函 数 名: main(void)
* 函数功能: 用PWM输出,调节占空比来调节LED灯的亮度
* 入口参数: 无
* 返 回: 无
*******************************************************************************/
void main(void)
{
PWM_Init();
Time2_Init();
while(1)
{ }
}/******************************************************************************
* 函 数 名: Timer2_ISR(void)
* 函数功能: 中断函数
* 入口参数: 无
* 返 回: 无
*******************************************************************************/void interrupt Timer2_ISR(void)
{
if(TMR2IF)
{ ++count;
if(count == 75)
{ ++gDutycount;
if(gDutycount == 39)
{ gDutycount = 0;
}
CCPR1L = SINETABLE[gDutycount]; // 根据sin表改变PWM波周期
count = 0;
}
TMR2IF = 0;
}
}
PIC单片机-PWM波相关推荐
- PIC单片机之PWM PWM原理
1,什么是PWM 什么是PWM,专业点说脉宽调制,通俗点说 就是不断的输出高低电平. 比如 单片机 40ms的时间 输出高电平然后60ms的时间 输出低电平接着一直不断周期性的交替输出高低电 ...
- STM32单片机一个定时器输出不同频率PWM波
在使用STM32单片机输出PWM波形的时候,通常可以直接使用定时器提供的PWM模式.可以通过自动重装载寄存器(TIMx_ARR)来设置定时器的输出频率,然后通过捕获/ 比较寄存器 1(TIMx_C ...
- STM32F103单片机生成16路PWM波
单片机输出pwm波在项目中是恨常用的一个功能,今天就总结一下用STM32F103C8T6单片机输出16路 pwm波. 使用keil5软件,用标准库函数来实现. 首先看定时器初始化 void TIM1_ ...
- STM32单片机:定时器TIM输出PWM波
学习32单片机过程中使用的工具:MDK Keil5 + 正点原子精英版(STM32F103ZET6)+ STM32CubeMX + HAL开发 一.PWM的产生原理 关于PWM的产生原理网上有很多教程 ...
- STM32 cubeMX下配置STM32单片机使无源蜂鸣器输出PWM波并放音乐
1.首先我们要了解定时器(timer) timer分为三种:高级定时器(tim1,tim8),基本定时器(tim6,tim7),通用定时器(tim2,tim3,tim4,tim5). 基本定时器:它有 ...
- spwm单片机4路输出C语言,基于PIC单片机的正弦波逆变器设计与实现
描述 目前,SPWM信号主要有3种生成方式: 1)使用比较器.振荡器等模拟电路产生三角波和方波进行比较,产生SPWM波,但是此种方法电路复杂,受元器件精度影响大,且不易控制: 2)利用专用SPWM集成 ...
- PIC单片机(PIC16F873)小项目五(电路工作原理)
怎么上传图片呀? 1.系统简介 本系统为xxx检测仪,用于检测xxx载重量,并以模拟输出量形式把载重量传递给主控制系统. 检测仪根据电梯轿底橡胶块随载重做弹性变化的原理,通过霍尔传感器检测其位移变化且 ...
- ioca0中断 pic单片机_关于PIC单片机的一些经验总结 -单片机-电子工程世界网
为了给前一段时间学习PIC16F616型单片机的一个总结和方便大家的交流,我写了这篇关于PIC单片机的学习心得,都是在看了手册和编程调试后用自己的语言组织的,其中有不足或者有疑问的地方希望大家能及时的 ...
- stm32f4 输出pwm波_stm32的pwm输出代码及注释
stm32是非常常用的单片机.脉冲宽度调制(PWM),是英文"Pulse WidthModulation"的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非 ...
最新文章
- 《Ext JS权威指南》节选:在Visual Studio中实现Ext JS智能提示
- 作业06-接口、内部类
- Ubuntu 16.04修改显示字体大小(包括GNOME/Unity)
- 组件面板 html 页面,Html - Bootstrap Panel面板
- Socket IO与NIO(三)
- 如何启动免安装版Tomcat并将Tomcat添加到服务中
- 博思得标签打印机驱动_惠普LaserJet 5200n驱动-惠普HP LaserJet 5200n打印机驱动下载 v61.074.561.43官方版...
- tensorflow之数据加载
- 07 -模型层ORM
- GoF的23种设计模式
- 三天掌握三菱FX系列PLC视频教程-IT学院-专题视频课程
- 一文读懂 delete和delete[ ]
- Photoshop for Mac(图像处理软件)破解版安装
- 【原理图专题】OrCAD Capture CIS中元件产生A,B属性解决办法
- 微应用 qiankun 项目搭建
- 深度好文:一篇Paper带您读懂HTAP | StoneDB学术分享会第①期
- Framer X 21 特别版 Mac 强大的移动应用交互原型设计神器工具
- 运动型蓝牙耳机怎么佩戴的,运动蓝牙耳机的不同款式盘点
- caj转换word转换器怎么操作?
- [Bash]LeetCode195. 第十行 | Tenth Line