沁恒CH32V307使用记录:使用TIM输出PWM信号
文章目录
- 目的
- 基础说明
- 使用例程
- 总结
目的
使用TIM输出PWM信号是单片机中比较常用的一个功能。这篇文章将对CH32V307中相关内容进行说明。
本文使用沁恒官方的开发板 (CH32V307-EVT-R1沁恒RISC-V模块MCU赤兔评估板) 进行演示。
基础说明
CH32V307拥有多个定时器,只有通用定时器和高级定时器支持PWM输出功能,需要注意的是不同的定时器默认可用时钟源是不同的:
使用TIM输出PWM信号总的来说操作上分为下面几个部分:
- 初始化TIM和输出PWM信号的GPIO口的时钟;
- 配置输出PWM信号的GPIO口为复用输出模式;
- 配置TIM基本定时参数;
- 配置PWM输出的通道与参数;
沁恒官方提供了库函数用于操作TIM,主要是 ch32v30x_tim.h
和 ch32v30x_tim.c
两个文件,前者中声明了提供给用户调用的函数以及相关的枚举和宏定义类型等。
使用TIM输出PWM信号使用中涉及的原理可以参考下面文章中的基础说明部分:
《使用HAL库开发STM32:Timer基础说明与定时功能使用》
《使用HAL库开发STM32:使用Timer输出PWM信号》
使用例程
CH32V307官方的PWM例程中使用的是TIM1,我这里使用TIM4进行演示,两者使用方式基本上是差不多的,下面是测试代码:
#include "debug.h"// 初始化GPIO、TIM、PWM,使用见下面main函数
void TIM4_PWMOut_Init(u16 psc, u16 arr, u16 ccp) {// 初始化时钟RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM4, ENABLE);// 初始化 TIM4_CH1引脚 (PB6)GPIO_InitTypeDef GPIO_InitStructure = { 0 };GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init( GPIOB, &GPIO_InitStructure);// 初始化 TIM4TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure = { 0 };TIM_TimeBaseInitStructure.TIM_Period = arr; // 计数周期(以TIM时钟分频后的时钟最为计数源)// 该值为9表示计数10次为一个周期,49表示计数50次为一个周期,依此类推TIM_TimeBaseInitStructure.TIM_Prescaler = psc; // 分频系数(对TIM时钟进行分频)// 该值为0表示不分频,1表示2分频,2表示3分频,依此类推TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit( TIM4, &TIM_TimeBaseInitStructure);TIM_ARRPreloadConfig( TIM4, ENABLE); // 使能arr预装载,如果需要TIM启用的情况下修改计数周期,那么通常使能预装载会比较安全// 初始化 TIM4_CH1 PWMTIM_OCInitTypeDef TIM_OCInitStructure = { 0 };TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_Pulse = ccp; // 比较参数,计数值与该值比较,来改变PWM通道输出电平TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OC1Init( TIM4, &TIM_OCInitStructure);// TIM_CtrlPWMOutputs(TIM4, ENABLE); // 高级定时器需要将这个使能才能输出PWMTIM_OC1PreloadConfig( TIM4, TIM_OCPreload_Disable); // 使能ccr1预装载,如果需要PWM启用的情况下修改比较参数,那么通常使能预装载会比较安全TIM_Cmd( TIM4, ENABLE); // 使能定时器
}int main(void) {NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);SystemCoreClockUpdate();Delay_Init();USART_Printf_Init(115200);printf("SystemClk:%d\r\n", SystemCoreClock);printf("ChipID:%08x\r\n", DBGMCU_GetCHIPID());TIM4_PWMOut_Init(96 - 1, 1000 - 1, 800); // 默认配置下时钟为96MHz,对时钟源96分频,即TIM计数时钟为1MHz// 计数周期设置为1000,结合上条每次计数为1ms,相当于频率为1000Hz// 根据比较模式和PWM模式设置,以及上面的参数设置,这里输出的PWM信号的占空比为80%while(1) {Delay_Ms(2500);TIM_SetCompare1( TIM4, 500); // 修改CCR1的值,此处修改后ARR为1000 - 1, 频率为1kHz,CCR1为500,占空比为50%Delay_Ms(2500);TIM_SetCompare1( TIM4, 200); // 修改CCR1的值,此处修改后ARR为1000 - 1,频率为1kHz, CCR1为200,占空比为20%Delay_Ms(2500);TIM_SetAutoreload( TIM4, 300 - 1); // 修改ARR的值,此处修改后ARR为300 - 1, 频率为3.33kHz,CCR1为200,占空比为66.67%Delay_Ms(2500);TIM_SetAutoreload( TIM4, 1000 - 1); // ARR设置为初始值TIM_SetCompare1( TIM4, 800); // CCR1设置为初始值}
}
上面代码演示如下,注意观察示波器波形下面的 频率、周期和占空比 :
总结
使用TIM输出PWM信号操作比较简单,只要了解相关原理基本上就能立马上手使用。
沁恒CH32V307使用记录:使用TIM输出PWM信号相关推荐
- 沁恒CH32V307使用记录:GPIO与EXTI
文章目录 目的 GPIO(通用输入输出接口) 基础说明 初始化 输出 输入与电平读取 锁定机制 EXTI(外部中断) 基础说明 使用演示 总结 目的 GPIO是单片机最基础的功能,EXTI最常用的场景 ...
- 沁恒CH32V307使用记录:SPI基础使用
文章目录 目的 基础说明 使用演示 其它补充 总结 目的 SPI是单片机中比较常用的一个功能.这篇文章将对CH32V307中相关内容进行说明. 本文使用沁恒官方的开发板 (CH32V307-EVT-R ...
- STM32—TIM3输出PWM信号驱动MG996R舵机(按键控制)
文章目录 一.前言 二.MG996R舵机简介 三.通用定时器TIMx 四.TIM3输出PWM信号代码详解 上传代码 一.前言 利用STM32的TIM3的通道1输出PWM信号,驱动MG996R舵机,按键 ...
- Winbond W25Qxx SPI FLASH 使用示例(基于沁恒CH32V307单片机)
文章目录 目的 基础说明 使用示例 总结 目的 Winbond(华邦)的 W25Qxx 系列 SPI FLASH 是比较常用的芯片,这篇文章将演示单片机中通过SPI使用该芯片的操作过程. 本文使用沁恒 ...
- 沁恒CH32V307单片机入门(01):基础说明与流程体验
文章目录 目的 基础说明 芯片介绍 资料与工具 开发环境 流程体验 开发 调试 下载 总结 目的 工作这几年单片机主要就接触过 Atmel.Renesas.Microchip.ST 这些厂家的,最近几 ...
- 沁恒CH32V307单片机入门(02):官方库与工程模板介绍
文章目录 目的 官方库 工程模板 使用例程 总结 目的 现在开发单片机大多数时候都是面向库开发的,这里将简单介绍下CH32V307的官方库. 在开发过程中新建项目时通常会从某些模板开始,模板包含了库和 ...
- STM32H743+CubeMX-定时器TIM输出PWM(Out Compare模式) + 中断
文章目录 一.前言 二.CubeMX 2.1.NVIC Settings 2.2.生成代码 三.代码 3.1.tim.c 四.DEBUG 五.细节补充 一.前言 STM32H743+CubeMX-定时 ...
- STM32H743+CubeMX-定时器TIM输出PWM(PWM Generation模式)+ 中断
文章目录 一.前言 二.CubeMX 2.1.Mode and Parameter Settings 2.2.NVIC Settings 2.3.生成代码 三.代码 3.1.tim.c 3.2.mai ...
- STM32H743+CubeMX-定时器TIM输出PWM(PWM Generation模式)
文章目录 一.前言 二.CubeMX 2.1.Clock Configuration 2.2.TIM8 Mode and Configuration 2.3.Parameter Settings Co ...
最新文章
- 【 C 】字符串函数专题
- 网站为什么要做优化?
- 漫谈WinCE输入法的编写(四)
- 从尼古拉斯·泽卡斯开始学习
- 记一次游戏私服getshell过程
- [Mvp.Blazor] 动态路由与钩子函数
- java比赛用多重for_关于 Java 中 for的多重循环
- knime二次开发节点的项目结构
- 计算机视觉基础——本质矩阵与基本矩阵(Essential and Fundamental Matrices)
- poj-3185-开关问题
- matlab memorySian,matlab内存溢出的解决方案
- JSONP原理以及示例
- 怎样修改管家婆服务器密码,管家婆辉煌版如何设置权限和修改操作员密码口令...
- android的sd卡分区,超强Android系统SD卡分区教程!
- Python爬虫——爬取博物馆新闻 + 情感倾向分析 + 导入数据库
- Autovue v21.0.2的新功能
- 大数据面试杀招 | Flink,大数据时代的“王者”
- MySql学习笔记(2)--数据库操作及数据管理
- Access数据库文件HeroDB.MDB用什么工具可以打开呢?
- 全球及中国少儿图书出版行业经营策略与投资竞争力研究报告2022-2028年
热门文章
- To avoid scope ambiguity, the default slot should also use template syntax when there are other na
- c# 音频文件转码(.wav,.ogg等)
- 网红打卡神器——“大窑嘉宾”便携装新上市
- float和double的区别
- Android设计模式(一)—— 建造者模式
- An Casual Overview of Reinforcement Learning
- 网页搜索之后的APP搜索
- uni-app 原生标题栏搜索输入框事件合集
- MARVELL电力线载波通讯芯片运用于家庭联网
- 找工作可靠点的招聘网站