文章目录
前言
up主的联系方式:
微信公众号:嵌入式up
大家好!大家点点关注,大家的关注才是我持续更新的动力!
一、PWM是什么?
众所周知,大家都知道pwm这个在生活或许学习,单片机学习中有着至关重要的作用和应用,比如说直流电机的调试、开关电源等等。
PWM:全称Pulse Width Modulation:脉冲宽度调制(简称脉宽调制,通俗的讲就是调节脉冲的宽度),是电子电力应用中非常重要的一种控制技术。
PWM是一种技术手段,是在这种技术手段控制下的脉冲波。要想学会PWM波首先我们得明白三个东西:脉宽、周期、占空比。
通俗的说,就是控制在一个周期内,控制高电平多长时间,低电平多长时间,也就是说通过调节高低电平时间的变化来调节信号的变化。
频率是指一定时间内信号从高电平到低电平再回到高电平的次数,为一个波形周期的倒数。频率=1/(0.003+0.001)=250 HZ(此计算公式为1s)
占空比是指高电平时间和下一个周期的时间。占空比=1/(1+3)=25%,所以可以通过控制占空比,来控制输出的电压。
所以对于方波的话,频率和占空比就确定了一个波。
脉冲周期(T):单位是时间,比如纳秒(ns)、微妙(μs)、毫秒(ms)等;
脉冲频率(f):单位是赫兹(Hz)、千赫兹(kHz)等,与脉冲周期成倒数关系,f=1/T;
占空比(D):脉宽除以脉冲周期的值,百分数表示,比如50%。
脉冲宽度(W):简称“脉宽”,是脉冲高电平持续的时间。单位是时间,比如纳秒(ns)、微妙(μs)、毫秒(ms)等;
公式如下:
后续计算以及和推导过程和公式得使用大家自行学习一下,此链接学习起来更加形象易懂。
这样理解PWM,想不懂都难!!! - 知乎 (zhihu.com)
https://zhuanlan.zhihu.com/p/374083276言归正传,我们还是直入主题下面讲解如何使用龙芯产生开发pwm。
二、PWM 芯片 GP7101
源代码:ls1x‐drv/i2c/gp7101/gp7101.c
头文件:ls1x‐drv/include/i2c/gp7101.h
GP7101 是否使用,在 bsp.h 中配置宏定义:
#define GP7101_DRV GP7101 挂接在 I2C0 上,I2C 地址和通信速率定义(gp7101.c):
#define GP7101_ADDRESS 0x58 /* 7 位地址 */
#define GP7101_BAUDRATE 100000 /* 100K */
1.驱动程序 gp7101.c 实现的函数:
int GP7101_write(void *dev, void *buf, int size, void *arg); 写数据
注:GP7101 芯片输出 100Hz 的 PWM 信号,用于触摸屏亮度控制。
int set_lcd_brightness(void *bus, int brightpercent); LCD 亮度控制 参数:brightpercent: 1~100
三、pwm波形的产生
1.开发步骤
第1步, 新建工程
第2步, 在 bsp.h 中打开 PWM2 设备的宏定义, 并在 main.c 下添加 ls1b_gpio.h 和 ls1x_pwm.h文件。
第3步, 定义 pwm_cfg_t 结构体配置 PWM open 的 arg 参数。
第4步, 编写一个中断回调函数
第5步, 调用 ls1x_pwm_timer_start函数启动 PWM2 工作,开始定时。
第6步, 调用 ls1x_pwm_timer_stop函数停止 PWM2 工作,停止定时
2.代码实现
代码如下(示例):
#include <stdio.h>
#include "ls1b.h"
#include "mips.h"
//-------------------------------------------------------------------------------------------------
// BSP
//-------------------------------------------------------------------------------------------------
#include "bsp.h"
#include "ls1b_gpio.h"
#include "ls1x_pwm.h"
//-------------------------------------------------------------------------------------------------
// 主程序
//-------------------------------------------------------------------------------------------------
int main(void)
{
printk("\r\nmain() function.\r\n");
gpio_enable(54,DIR_OUT);
gpio_enable(3,DIR_OUT);
gpio_enable(2,DIR_OUT);
gpio_write(54,1);
gpio_write(3,1);
gpio_write(2,1);
gpio_disable(3);
unsigned char count = 1;
pwm_cfg_t cfg;
cfg.cb = NULL;
cfg.isr = NULL;
cfg.mode = PWM_CONTINUE_PULSE;
/*
* 裸机主循环
*/
for (;;)
{
cfg.hi_ns = count * 100;
cfg.lo_ns = 5000 - count * 100;
ls1x_pwm_pulse_start(devPWM2,&cfg);
delay_ms(30);
ls1x_pwm_pulse_stop(devPWM2);
count++;
if(count >= 49)
{
count = 1;
}
}
/*
* Never goto here!
*/
return 0;
}
总结
·源码链接:(6条消息) 龙芯1B:pwm的使用例程-嵌入式文档类资源-优快云文库
联系我们
公众号 嵌入式up 如果文章对您有帮助,请打赏一元呗,感谢支持,分享不易,码字不易。希望对大家帮助!