BSR3100芯片之PWM应用

BSR3100包含8个16bit的 PWM模块。每个PWM 都支持反向,死区控制。

PWM管脚分配在5V IO域和3.3V 的IO域上:

第1种应用:电机驱动

PWM控制波形1:

 

对应的代码:

PWM控制波形2:

 

对应着的代码如上图片所示。

第2种应用:充电与升压

详细实现代码,请在qq群中索取。

第3种应用:电容触摸按键

下图的原理图,每一个按键包含了 10P,104 电容器,一只贴片封装的双二极管, 三个电阻。

第4种应用:语音播放

BSR3100的IO支持3.3V IO,1.8V IO,还有VBAT IO。在电池供电的应用场景中,可以非常简洁的满足多电压域场景下的用户需求。BSR3100的优势和特点:

1,集成了专用LDO(Norflash和LCD各一个)
2,外置Norflash更灵活
3,专用DMA
4,高速SPI配合LCD显示,速度最高可达12Mbps
5,芯片内部专用ADC5测量VBAT,读寄存器即可
6,专用MOS用于LCD背光控制,进一步省去板级上的外围器件
7,电流采集专用运放和高速比较器,比较器可以连接在中断列表中,软件快速响应
8,丰富的IO类型,1.8V IO 4个,5V IO 12个,3.3V IO 8个(不包含专用IO)
9,运算放大器可以内部连接ADC8和ADC9,不占用管脚资源

应用场景:

所有电池供电的带LCD/OLED/TFT显示屏的电子产品。
 

#include "SYSCFG.h" //********************************************************* //Variable definition volatile char W_TMP @ 0x70 ;//系统占用不可以删除和修改 volatile char BSR_TMP @ 0x71 ;//系统占用不可以删除和修改 //=========================================================== //Funtion name:interrupt ISR //parameters:无 //returned value:无 //=========================================================== void interrupt ISR(void) { #asm;//系统设置不可以删除和修改 NOP;//系统设置不可以删除和修改 NOP;//系统设置不可以删除和修改 NOP;//系统设置不可以删除和修改 NOP;//系统设置不可以删除和修改 NOP;//系统设置不可以删除和修改 NOP;//系统设置不可以删除和修改 NOP;//系统设置不可以删除和修改 NOP;//系统设置不可以删除和修改 NOP;//系统设置不可以删除和修改 NOP;//系统设置不可以删除和修改 NOP;//系统设置不可以删除和修改 NOP;//系统设置不可以删除和修改 NOP;//系统设置不可以删除和修改 NOP;//系统设置不可以删除和修改 NOP;//系统设置不可以删除和修改 NOP;//系统设置不可以删除和修改 NOP;//系统设置不可以删除和修改 NOP;//系统设置不可以删除和修改 NOP;//系统设置不可以删除和修改 NOP;//系统设置不可以删除和修改 NOP;//系统设置不可以删除和修改 #endasm;//系统设置不可以删除和修改 //user_isr(); //调用用户中断函数 } /*------------------------------------------------- * 函数名:POWER_INITIAL * 功能: 上电系统初始化 * 输入: 无 * 输出: 无 --------------------------------------------------*/ void POWER_INITIAL (void) { OSCCON = 0B01110001; //16MHz 1:1 INTCON = 0; //暂禁止所有中断 PORTA = 0B00000000; TRISA = 0B00000000; //PA输入输出 0-输出 1-输入 PA4,PA5输出 PORTB = 0B00000000; TRISB = 0B00000000; //PB输入输出 0-输出 1-输入 PORTC = 0B00000000; TRISC = 0B00000000; //PC输入输出 0-输出 1-输入 WPUA = 0B00000000; //PA端口上拉控制 1-开上拉 0-关上拉 WPUB = 0B00000000; //PB端口上拉控制 1-开上拉 0-关上拉 WPUC = 0B00000000; //PC端口上拉控制 1-开上拉 0-关上拉 WPDA = 0B00000000; //PA端口下拉控制 1-开下拉 0-关下拉 WPDB = 0B00000000; //PB端口下拉控制 1-开下拉 0-关下拉 WPDC = 0B00000000; //PC端口下拉控制 1-开下拉 0-关下拉 PSRC0 = 0B11111111; //PORTA 源电流设置最大 0:最小,1:最大 PSRC1 = 0B11111111; //PORTB 源电流设置最大 0:最小,1:最大 PSRC2 = 0B11111111; //PORTC 源电流设置最大 00:最小 11:最大 PSINK0 = 0B11111111; //PORTA灌电流设置最大 0:最小,1:最大 PSINK1 = 0B11111111; //PORTB灌电流设置最大 0:最小,1:最大 PSINK2 = 0B11111111; //PORTC灌电流设置最大 0:最小,1:最大 ANSELA = 0B00000000; //全为数字管脚 } /*------------------------------------------------- * 函数名:Time2Initial * 功能: 定时器2初始化 * 输入: 无 * 输出: 无 -------------------------------------------------*/ void Time2Initial(void) { PCKEN |=0B00000100; //使能timer2时钟模块 CKOCON=0B00100000; TCKSRC=0B00110000; //TIM2时钟为HIRC的2倍频 //Bit7:低频内振模式:1 = 256K 振荡频率模式,0 = 32K 振荡频率模式 //Bit[6:4]:TIM2时钟源选择位 //值 时钟源 //0 系统时钟/主时钟 //1 HIRC //2 XT时钟/外部时钟 //3 HIRC的2倍频 //4 XT时钟/外部时钟的2倍频 //5 LIRC //6 LP时钟/外部时钟 //7 LP时钟/外部时钟的2位频 //Bit3:保留位 //Bit[2:1]:TIM1时钟源选择位 //值 时钟源 //0 系统时钟/主时钟 //1 HIRC //2 XT时钟/外部时钟 //3 HIRC的2倍频 //4 XT时钟/外部时钟的2倍频 //5 LIRC //6 LP时钟/外部时钟 //7 LP时钟/外部时钟的2位频 TIM2CR1 =0B10000101; //预载允许,边沿对齐向上计数器,计数器使能 //Bit7:自动预装载允许位 //0: TIM2_ARR寄存器没有缓冲,它可以被直接写入; //1: TIM2_ARR寄存器由预装载缓冲器缓冲。 //Bit[6:4]:保留位 //Bit3:单脉冲模式 //0: 在发生更新事件时,计数器不停止; //1: 在发生下一次更新事件(清除CEN位)时,计数器停止。 //Bit2:更新请求源 //0: 如果UDIS允许产生更新事件,则下述任一事件产生一个更新中断: //寄存器被更新(计数器上溢/下溢) //1: 如果UDIS允许产生更新事件,则只有当下列事件发生时才产生更新中断,并UIF置1: //寄存器被更新(计数器上溢/下溢) //Bit1:禁止更新 //0: 一旦下列事件发生,产生更新(UEV)事件: //计数器溢出/下溢 //产生软件更新事件 //1: 不产生更新事件,影子寄存器(ARR、PSC、CCRx)保持它们的值。 //Bit0:允许计数器 //0: 禁止计数器; //1: 使能计数器。 TIM2IER =0B00000000; //禁止所有中断 //Bit[7:4]: 保留位 //Bit3: 允许捕获/比较3中断 //0: 禁止捕获/比较3中断; //1: 允许捕获/比较3中断。 //Bit2: 允许捕获/比较2中断 //0: 禁止捕获/比较2中断; //1: 允许捕获/比较2中断。 //Bit1: 允许捕获/比较1中断 //0: 禁止捕获/比较1中断; //1: 允许捕获/比较1中断。 //Bit0: 允许更新中断 //0: 禁止更新中断; //1: 允许更新中断。 TIM2SR1 =0B00000000; //Bit[7:4]: 保留位 //Bit3: 捕获/比较3中断标记(写1清0,写0无效) //参考T2CC1IF描述。 //Bit2: 捕获/比较2中断标记(写1清0,写0无效) //参考T2CC1IF描述。 //Bit1: 捕获/比较1中断标记(写1清0,写0无效) //如果通道CC1配置为输出模式: 当计数器值与比较值匹配时该位由硬件置1,由软件清0。 //0: 无匹配发生; //1: TIM2_CNT的值与TIM2CCR1H/L的值匹配。 //如果通道CC1配置为输入捕捉模式: 当捕获事件发生时该位由硬件置1,它由软件清0或通过读TIM2CCR1L清0。 //0: 无输入捕获产生; //1: 计数器值已被捕获(拷贝)至TIM2CCR1H/L(在IC1上检测到与所选极性相同的边沿)。 //Bit0: 更新中断标记(写1清0,写0无效) //当产生更新事件时该位由硬件置1。它由软件清0。 //0: 无更新事件产生; //1: 更新事件等待响应。 TIM2SR2 = 0B00000000; TIM2EGR = 0B00000000; //Bit[7:4]: 保留位 //Bit3: 产生捕获/比较3事件 //参考T2CC1G描述。 //Bit2: 产生捕获/比较2事件 //参考T2CC1G描述。 //Bit1: 产生捕获/比较1事件 //该位由软件置1,用于产生一个捕获/比较事件,由硬件自动清0。 //0: 无动作; //1: 在通道CC1上产生一个捕获/比较事件: //若通道CC1配置为输出: //设置T2CC1IF=1,若开启对应的中断,则产生相应的中断。 //若通道CC1配置为输入: //当前的计数器值被捕获至TIM2CCR1H/L寄存器,设置T2CC1IF=1,若开启对应的中断, //则产生相应的中断。若T2CC1IF已经为1,则设置T2CC1OF=1。 //Bit0: 产生更新事件 //该位由软件置1,由硬件自动清0。 //0: 无动作; //1: 重新初始化计数器,并产生一个更新事件。 //注意预分频器的计数器也被清0(但是预分频系数不变)。若在T2DIR=0(向上计数)则计数器被清0;若T2DIR=1(向下计数)则计数器初始化为TIM1ARRH/L的值。 TIM2CCMR1 = 0B01101000; //CC1通道被配置为输出 //Bit7: 保留位。 //Bit[6:4]: 输出比较1模式 //该3位定义了输出参考信号OC1REF的动作,而OC1REF决定了OC1的值。OC1REF是高电平有效,而OC1的有效电平取决于T2CC1P位。 //000: 冻结。输出实际比较值(CCRx_SHAD)与计数器TIM2_CNT间的比较对OC1REF不起作用;; //001: 匹配时设置通道1的输出为有效电平。当计数器TIM2_CNT的值与捕获/比较寄存器1(TIM2_CCR1)相同时,强制OC1REF为高。 //010: 匹配时设置通道1的输出为无效电平。当计数器TIM2_CNT的值与捕获/比较寄存器1(TIM2_CCR1)相同时,强制OC1REF为低。 //011: 翻转。当TIM2_CCR1=TIM2_CNT时,翻转OC1REF的电平。 //100: 强制为无效电平。强制OC1REF为低。 //101: 强制为有效电平。强制OC1REF为高。 //110: PWM模式1- 在向上计数时,一旦TIM2_CNT<TIM2_CCR1时通道1为有效电平,否则为无效电平;在向下计数时,一旦TIM2_CNT>TIM2_CCR1时通道1为无效电平(OC1REF=0), 否则为有效电平(OC1REF=1)。 //111: PWM模式2- 在向上计数时,一旦TIM2_CNT<TIM2_CCR1时通道1为无效电平,否则为有效电平;在向下计数时,一旦TIM2_CNT>TIM2_CCR1时通道1为有效电平,否则为无效电平。 //Bit3: 输出比较1预装载使能 //0: 禁止TIM2CCR1H/L寄存器的预装载功能,可随时写入T2CCR1寄存器,并且新写入的数值立即起作用。 //1: 开启TIM2CCR1H/L寄存器的预装载功能,读写操作仅对预装载寄存器操作,TIM2CCR1H/L的预装载值在更新事件到来时被加载至当前寄存器中。 //Bit2:保留位 //Bit[1:0]: 捕获/比较1 选择。这2位定义通道的方向(输入/输出),及输入脚的选择: //00: 通道1被配置为输出; //01: 通道1被配置为输入,IC1映射在TI1FP1上; //10: 通道1被配置为输入,IC1映射在TI2FP1上; //11: 预留。 //注: CC1S仅在通道关闭时(TIM2CCER1寄存器的T2CC1E=0)才是可写的。 TIM2CCMR2 = 0B01101000; //CC2通道被配置为输出 TIM2CCMR3 = 0B00000000; TIM2CCER1 = 0B00110011; //比较2互补输出使能,低电平有效;比较器1输出使能,低电平有效 //Bit[7:6]: 保留位。 //Bit5: 输入捕获/比较2输出极性。参考T2CC1P的描述。 //Bit4: 输入捕获/比较2输出使能。参考T2CC1E的描述。 //Bit[3:2]: 保留位。 //Bit1: 输入捕获/比较1输出极性 //通道1配置为输出: //0: OC1高电平有效; //1: OC1低电平有效。 //通道1配置为触发输入: //0: 触发发生在TI1F的高电平或上升沿; //1: 触发发生在TI1F的低电平或下降沿。 //通道1配置为捕捉输入: //0: 捕捉发生在TI1F的高电平或上升沿; //1: 捕捉发生在TI1F的低电平或下降沿。 //Bit0: 输入捕获/比较1输出使能 //通道1配置为输出: //0: 关闭- OC1禁止输出 //1: 开启- OC1信号输出到对应的输出引脚。 //通道1配置为输入: //该位决定了计数器的值是否能捕获入TIM2CCR1寄存器。 //0: 捕获禁止; //1: 捕获使能。 TIM2CCER2 = 0B00000000; TIM2CNTRH = 0B00000000; //TIM2计数器 TIM2CNTRL = 0B00000000; TIM2ARRH = 0x03; //自动重载,周期 TIM2ARRL = 0xe8; TIM2CCR1H = 0x01; //PWM脉宽 TIM2CCR1L = 0xf4; TIM2CCR2H = 0x01; TIM2CCR2L = 0xf4; TIM2CCR3H = 0B00000000; TIM2CCR3L = 0B00000000; } /*------------------------------------------------- * 函数名:main * 功能: 主函数 * 输入: 无 * 输出: 无 --------------------------------------------------*/ void main(void) { POWER_INITIAL(); //系统初始化 Time2Initial(); while(1) { NOP(); } }
08-05
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值