STM32F103移相全桥PWM寄存器实现

2023-10-27

STM32F103移相全桥PWM寄存器实现

由于项目需求需要使用单片做一个移相全桥的DCDC电源。采用STM32F103芯片,采用直接控制寄存器实现PWM移相控制

基本原理

两桥臂分别使用定时器TIM1和TIM8产生互补输出信号,TIM8作为从定时器,其计数器复位由TIM1控制

TIM1初始化

void time1_pwm_init(u16 arr,u16 ccr1,u16 ccr2)
{
	//
	//调整ccr1从0 到500,实现移相角度从0到180度
	RCC->APB2ENR|=1<<0;//辅助功能IO时钟使能 
	RCC->APB2ENR|=1<<2;  //使能PORTA时钟,IO口A时钟使能
	RCC->APB2ENR|=1<<3;  //使能PORTB时钟,IO口B时钟使能
	RCC->APB2ENR|=1<<11;//TIM1时钟使能
	GPIOA->CRH&=0XFFFFFF0F; //PA9 推挽输出CHZ
	GPIOA->CRH|=0X000000B0; //输出
	GPIOB->CRH&=0XF0FFFFFF; //PB14 推挽输出
	GPIOB->CRH|=0X0B000000; //输出

	TIM1->ARR=arr;//自动重装载寄存器(TIM1_ARR)
	TIM1->PSC=0;//预分频器(TIM1_PSC),等于fCK_PSC/( PSC[15:0]+1)
	TIM1->CCMR1|=6<<12;//PWM模式1
 	TIM1->CCMR1|=1<<11;//开启TIM1_CCR1寄存器的预装载功能
//	TIM1->RCR=0x0000;//在边沿对齐模式下, PWM周期的数目(REP+1)对应着
	//使TIME1的OC1为TIM8的复位信号
	TIM1->CCMR1|=7<<4;//OC1M[2:0]:输出比较1模式- 在向上计数时PWM2
	TIM1->CCMR1|=1<<3;//开启TIM1_CCR1 OC1PE输出比较1预装载使能
	TIM1->CR2|=4<<4;//MMS[1:0]:主模式选择100:比较 – OC1REF信号被用于作为触发输出(TRGO)。
	

	TIM1->CCMR1|=1<<10;//OC2FE 01: 输出比较2快速使能	
	TIM1->CCER|=1<<4;//开启- OC2信号输出到对应的输出引脚
	TIM1->CCER|=1<<6;//开启- OC2N信号输出到对应的输出引脚
	TIM1->CR1&=~(1<<4);//向上计数	TIM1->CR1&=~(1<<4);//向上计数
	TIM1->CR1&=~(3<<5);//边沿对齐模式
	TIM1->CCR1=ccr1;//(1599+1)/2-1
	TIM1->CCR2=ccr2;//(1599+1)/2-1 
	TIM1->CR1|=1<<7;//TIM1_ARR寄存器被装入缓冲器
	TIM1->CR1|=1<<0;//开启计数器
 


	TIM1->EGR|=1<<0;
	TIM1->BDTR|=0<<13;//刹车极性
	TIM1->BDTR|=0<<12;//刹车使能
	TIM1->BDTR|=90<<0;//Tdtg = 1× TDTS
	TIM1->BDTR|=1<<15;//则开启OC和OCN输出
   
}

TIM8初始化

void time8_pwm_init(u16 arr,u16 ccr2)
{
	RCC->APB2ENR|=1<<0;  //辅助功能IO时钟使能 
	RCC->APB2ENR|=1<<3;  //使能PORTB时钟,IO口B时钟使能
	RCC->APB2ENR|=1<<4;  //使能PORTC时钟,IO口C时钟使能
	RCC->APB2ENR|=1<<13; //TIM8时钟使能
	GPIOB->CRL&=0XFFFFFFF0; //PB0  推挽输出CHZ
	GPIOB->CRL|=0X0000000B; //输出
	GPIOC->CRL&=0X0FFFFFFF; //PC7 推挽输出
	GPIOC->CRL|=0XB0000000; //输出

	TIM8->ARR=arr;//自动重装载寄存器(TIM1_ARR)
	TIM8->PSC=0;//预分频器(TIM1_PSC),等于fCK_PSC/( PSC[15:0]+1)

	
	
	TIM8->CCMR1|=6<<12;//PWM模式1- 在向上计数时,一旦TIM1_CNT<TIM1_CCR1时通道1为有效电平,否
//则 为 无 效 电 平 ; 在 向 下 计 数 时 , 一 旦 TIM1_CNT>TIM1_CCR1 时 通 道 1 为 无 效 电 平
//(OC1REF=0),否则为有效电平(OC1REF=1)。
 	TIM8->CCMR1|=1<<11;//开启TIM1_CCR1寄存器的预装载功能
	
	//使TIME8的接收TIME1的OCref信号
	TIM8->SMCR|=1<<7;//主/从模式
	
	TIM8->SMCR|=4<<0;//SMS:从模式选择,100 复位模式 ,选中的触发输入(TRGI)的上升沿重新初始化计数器
	TIM8->SMCR|=0<<4;//TS[2:0]:触发选择 000: ITR0 TIMx内触部触发连接
	TIM8->SMCR|=0<<5;
	TIM8->SMCR|=0<<6;
	TIM8->CCER|=0<<0;
	TIM8->CCMR1|=1<<0;	
	
	TIM8->CCMR1|=1<<10;//OC2FE 01: 输出比较2快速使能	
	TIM8->CCER|=1<<4;//开启- OC2信号输出到对应的输出引脚
	TIM8->CCER|=1<<6;//开启- OC2N信号输出到对应的输出引脚
	TIM8->CR1&=~(1<<4);//向上计数
	TIM8->CR1|=1<<7;//TIM1_ARR寄存器被装入缓冲器
	TIM8->CR1|=1<<0;//开启计数器
    TIM8->CNT;
	
	TIM8->CCR2=ccr2;//(1599+1)/2-1
	TIM8->EGR|=1<<0;
	TIM8->BDTR|=0<<13;//刹车极性
	TIM8->BDTR|=0<<12;//刹车使能
	
	TIM8->BDTR|=90<<0;//Tdtg = 1× TDTS
	TIM8->BDTR|=1<<15;//则开启OC和OCN输出

}

代码的关键是如何让TIM1的CCR1产生的OC1REF去触发TIM8的计数复位
关键部分如下:

	//使TIME1的OC1为TIM8的复位信号
	TIM1->CCMR1|=7<<4;//OC1M[2:0]:输出比较1模式- 在向上计数时PWM2
	TIM1->CCMR1|=1<<3;//开启TIM1_CCR1 OC1PE输出比较1预装载使能
	TIM1->CR2|=4<<4;//MMS[1:0]:主模式选择100:比较 – OC1REF信号被用于作为触发输出(TRGO)。
	//使TIME8的接收TIME1的OC1ref信号
	TIM8->SMCR|=1<<7;//主/从模式
	TIM8->SMCR|=4<<0;//SMS:从模式选择,100 复位模式 ,选中的触发输入(TRGI)的上升沿重新初始化计数器
	TIM8->SMCR|=0<<4;//TS[2:0]:触发选择 000: ITR0 TIMx内触部触发连接
	TIM8->SMCR|=0<<5;
	TIM8->SMCR|=0<<6;
	TIM8->CCER|=0<<0;
	TIM8->CCMR1|=1<<0;

通过调整TIM1->CCR1的值从0到500即可调整占空比从0到100%变化
当TIM1->CCR1=100时的波形:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32F103移相全桥PWM寄存器实现 的相关文章

  • 子串和子序列(python)

    子串 串中任意个连续的字符组成的子序列称为该串的子串 子序列 序列的一部分项按原有次序排列而得的序列 coding utf 8 1 连续子串最大和 def MaxSum arr res s arr 0 arr 0 for x in arr

随机推荐

  • 二叉树专题

    二叉树专题 二叉树的存储与基本操作 二叉树的遍历 先序遍历 中序遍历 后序遍历 层次遍历 利用先序遍历和中序遍历构造二叉树 二叉树的静态实现 一般的树 存储 新建结点 遍历 代码来源 晴神 算法笔记 二叉树的存储与基本操作 定义 struc
  • Git部署与使用

    Git部署与使用 欢迎关注 攻城狮Gala 公 众 号 每天一起学习 努力成为Web3全栈 摘要 当你有自己的服务器 同时期望私有化进行版本管理内容 or 代码 部署自己的Git服务器是一个绝佳选择 背景 之前折腾笔记同步 虽然已经有S3可
  • java ee考试题_Java-EE考试习题

    Java EE考试习题 如果缺少破土面出并与风雪拚搏的勇气 种子的前途并不比落叶美妙一分 以下是小编为大家搜索整理了Java EE考试习题 希望能给大家带来帮助 更多精彩内容请及时关注我们应届毕业生考试网 第一章 1 JavaEE架构中各层
  • 基于python技术的电商母婴购物数据分析

    人生苦短 我用python Python其他实用资料 点击此处跳转文末名片获取 一 数据集概述 今天我们来看一个来着阿里云天池的数据集 淘宝母婴购物数据 有两个csv文件 mum baby csv mum baby trade histor
  • 考研笔记:有关片选信号逻辑表达式求解的探究

    考研笔记 有关片选信号逻辑表达式求解的探究 今天做题时碰到了一个让人非常头疼的问题 是一道涉及到计算机组成原理知识点的题目 本以为通过之前书上讲的普通方法便可立即解出此题 但跃跃一试一番后 发现自己却错地一塌糊涂 于是便打开参考答案仔细研究
  • IDEA新建xml文件显示内容为普通文本,删除掉该文件重新创建后,类型依然不正确

    我们在创建文件的时候 没有加后缀名 然后进入到第二个页面很容易乱点到一些规则 导致即使删除掉该文件重新创建后 类型依然不正确 这个时候我们需要进入settings gt Editor gt File Type内 一般先查看Auto dete
  • Unity 编辑器里重新加载场景后灯光变暗

    编辑器里 需要重新加载场景时 遇到灯光变暗的情况 重新加载后 变暗 例如 SceneManager LoadScene 本场景名称 本场景名称可以通过以下方式获取 print SceneManager GetActiveScene name
  • linux socket 构造dns,Linux socket编程 DNS查询IP地址

    本来是一次计算机网络的实验 但是还没有完全写好 DNS的响应请求报文的冗余信息太多了 不只有IP地址 所以这次的实验主要就是解析DNS报文 同时也需要正确的填充请求报文 如果代码有什么bug 欢迎指正啊 代码排版有点乱 本文有以下内容 DN
  • 西门子编程基础学习分享(5)-定时器计数器

    前文已经对S7 1200的指令系统中的逻辑位指令做出了叙述 现继续分享其指令系统 1 定时器 1 接通延时定时器 TON 时序图说明 当定时器输入端 IN 的状态为1时 定时器启动并开始计时 定时器的当前值便开始累加 当定时器的当前值等于设
  • 处理大并发之五 使用libevent利器bufferevent

    处理大并发之五 使用libevent利器bufferevent 首先来翻译一段文章 你可能注意到随着我们代码变得越来越高效 程序也变得更加复杂 当我们产生一个进程的时候 我们没有必要为每一个链接管理一个buffer 我们只需要每个处理独立栈
  • 低谷期成长日志

    低谷期成长日志 很长一段时间没有写技术博客了 这段时间一直把自己沉没在DIY一个ArchLinux系统 其实主要还是受了些求职打击 无所事事 就想做些自己感兴趣的东西来度过这段糟糕的时间 当我写下这篇博客的时候 我大抵是走出低谷期了 这段时
  • 一个 ChatGPT,还能养活多少 AI 新老板?

    内容一览 当下 国内 AI 创业十分火爆 截止目前加入这个阵营的已有贾扬清等多位明星创业者 然而 这次 ChatGPT 的出现能否打破国内 AI 公司缺少规模化落地的创业 魔咒 本文首发自 HyperAI超神经微信公众号 刚刚过去的几个月
  • 在Delphi中创建线程,请一定使用BeginThread()代替CreateThread()创建线程!

    在Delphi中创建线程 请一定使用BeginThread 代替CreateThread 创建线程 如果直接使用Win32的API函数CreateThread 创建多个线程 也是可以创建的 但是 你应该明白 在每个线程中动态分配和销毁内存块
  • IOS检测晃动的两种方式

    第一种 第一步 在AppDelegate中设置如下 BOOL application UIApplication application didFinishLaunchingWithOptions NSDictionary launchOp
  • 【踩坑】慎用线程池,导致生产环境假死

    踩坑 慎用线程池 导致生产环境假死 1 场景 2 问题 3 总结 4 填坑 5 补充 排查问题 java进程压测时不知为何崩溃 killed 线程和内存 1 场景 项目里的很多地方的分页查询 原本是复杂的sql 然后我将其优化成查主表 然后
  • JAVA配置多数据源并动态切换

    参考 https my oschina net simpleton blog 916108 http wenqy com 2017 12 24 spring boot E5 AD A6 E4 B9 A0 E7 B3 BB E5 88 97
  • 基于uniapp开发 微信小程序登陆页面一

    此微信登陆页面是参考uniapp开发文档 uniapp一键登录和button组件中的 getphonenumber方法 代码展示
  • Vue项目如何引入JQuery详细步骤

    用vue cli脚手架工具构建项目成功后 如果需要引入JQ 步骤如下 1 在Jquery官网下载 https jquery com download 2 首先在项目中找到在package json文件 在package json里做如下操作
  • HDFS的 /路径介绍+2客户端命令工具+3命令+4mapreduce单词解析

    路径介绍 对应路径 home hadoop apps hadoop 2 6 4 tmp dfs data current BP 271701141 192 168 232 128 1546395882610 current finalize
  • STM32F103移相全桥PWM寄存器实现

    STM32F103移相全桥PWM寄存器实现 由于项目需求需要使用单片做一个移相全桥的DCDC电源 采用STM32F103芯片 采用直接控制寄存器实现PWM移相控制 基本原理 两桥臂分别使用定时器TIM1和TIM8产生互补输出信号 TIM8作