合泰HT32F52352(GPTM)多路PWM控制

关于合泰HT32F52352多路pwm的控制,困了几天,今天终于得到解决,不得不说合泰的相关资料太少了,并且很多博主分享的可能和我们的芯片型号不同差别还是有点大的,ht32f52352的使用倒和stm32形式上很像,所以在学习过程中,对于一些外设的控制我们同样可以借鉴一下stm32的使用规则,然后进行相关的修改。下面会以PWM产生和捕捉定时器(GPTM) 控制四路舵机进行分享,希望可以帮助到正在学习HT32的小伙伴们。
其他博主的分享

实验效果

ht32多路舵机控制

话规正题

前面已分享了基本定时器的使用,以及定时器的分类,这里就不在重复需要的小伙伴,同样对于舵机的控制在stm32多路舵机控制也有讲,使用方法是一模一样的只是调用函数和传参不同,进行移植还是很通用的,请前往另两篇博文

stm32多路舵机控制
ht32f52352基本定时器的使用

下面先给出GPTM定时器的配置然后进行相应的分析
这是我使用的是GPIOA 4/5/6/7引脚GPTM0进行配置的,很多引脚都可以进行配置 大家根据数据手册进行配置就好了



time.h

#ifndef _TIME_H_
#define _TIME_H_
#include "ht32f5xxxx_bftm.h"#define HTGPIO_PIN (GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7)void GPTM_PWM_init();
void Servo_Run(uint16_t angle);
void Servo_Run2(uint16_t angle);
void Servo_Run3(uint16_t angle);
void Servo_Run4(uint16_t angle);
#endif

time.c

从下面初始化函数中 不难看出Ht32GPTM pwm配置的时候和stm32真的很像,只是配置名称不同,所以如果有一定的32基础下面代码还是很容易看懂的

#include "time.h"
#include "delay.h"//输出四路PWM波控制后轮两个电机
//arr:自动重装值
//psc:时钟预分频数
//GT0 PA4 PA5 PA6 PA7
//产生一个20ms 定时周期
void GPTM_PWM_init()
{TM_TimeBaseInitTypeDef TimeBaseIniture;   //结构体TM_OutputInitTypeDef   OutIniture;CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};CKCUClock.Bit.PA         = 1;       //GPIOA时钟打开CKCUClock.Bit.AFIO       = 1;       //复用时钟CKCUClock.Bit.GPTM0      = 1;CKCU_PeripClockConfig(CKCUClock, ENABLE);      //时钟使能AFIO_GPxConfig(GPIO_PA, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7, AFIO_MODE_4);  //开启复用功能GPIO_DirectionConfig(HT_GPIOA,HTGPIO_PIN,GPIO_DIR_OUT);TM_ClearFlag(HT_GPTM0, TM_FLAG_UEV);  //清除更新中断标志TM_OutputStructInit(&OutIniture);    //填写每个变量的默认值//定时器时基以及计数方式初始化TimeBaseIniture.CounterMode = TM_CNT_MODE_UP;            //边沿对齐向上模式TimeBaseIniture.CounterReload = 200-1;                       //计数重装载计数器TimeBaseIniture.Prescaler = 4800 -1;                           //预分频系数TimeBaseIniture.PSCReloadTime=TM_PSC_RLD_IMMEDIATE;    //立即重装载TM_TimeBaseInit(HT_GPTM0,&TimeBaseIniture);//  0通道输出 PA4OutIniture.Channel= TM_CH_0;OutIniture.Control= TM_CHCTL_ENABLE;         //GPTM通道使能OutIniture.OutputMode=TM_OM_PWM1 ;          //GPTM 通道 PWM1输出模式  PWM2模式翻转OutIniture.Polarity= TM_CHP_INVERTED;    //GPTM 通道极性是低电平或下降沿// OutIniture.Compare=200;                      // 这个是配置占空比的TM_OutputModeConfig(HT_GPTM0,TM_CH_0,TM_OM_PWM1);TM_OutputInit(HT_GPTM0,&OutIniture);//  1通道输出 PA5OutIniture.Channel=TM_CH_1;OutIniture.Control=TM_CHCTL_ENABLE;         //GPTM通道使能OutIniture.OutputMode=TM_OM_PWM1;          //GPTM 通道 PWM1输出模式  PWM2模式翻转OutIniture.Polarity=TM_CHP_INVERTED;     //GPTM 通道极性是低电平或下降沿//OutIniture.Compare=200;                      // 这个是配置占空比的TM_OutputModeConfig(HT_GPTM0,TM_CH_1,TM_OM_PWM1);TM_OutputInit(HT_GPTM0,&OutIniture);//  2通道输出 PA6OutIniture.Channel=TM_CH_2;OutIniture.Control=TM_CHCTL_ENABLE;         //GPTM通道使能OutIniture.OutputMode=TM_OM_PWM1;          //GPTM 通道 PWM1输出模式  PWM2模式翻转OutIniture.Polarity=TM_CHP_INVERTED;    //GPTM 通道极性是低电平或下降沿//OutIniture.Compare=200;                      // 这个是配置占空比的TM_OutputModeConfig(HT_GPTM0,TM_CH_2,TM_OM_PWM1);TM_OutputInit(HT_GPTM0,&OutIniture);//  3通道输出 PA7OutIniture.Channel=TM_CH_3;OutIniture.Control=TM_CHCTL_ENABLE;         //GPTM通道使能OutIniture.OutputMode=TM_OM_PWM1;          //GPTM 通道 PWM1输出模式  PWM2模式翻转OutIniture.Polarity=TM_CHP_INVERTED;    //GPTM 通道极性是低电平或下降沿// OutIniture.Compare=200;                      // 这个是配置占空比的TM_OutputModeConfig(HT_GPTM0,TM_CH_3,TM_OM_PWM1);TM_OutputInit(HT_GPTM0,&OutIniture);TM_IntConfig(HT_GPTM0, TM_INT_CH0CC|TM_INT_CH1CC|TM_INT_CH2CC|TM_INT_CH3CC, ENABLE);  //中断TM_Cmd(HT_GPTM0,ENABLE);  //使能计数
}/*** 功能:舵机驱动(可从0~180,每45度旋转一次)* 参数:angle  ;舵机旋转度数(相对角度)* 返回值:None*/
void Servo_Run(uint16_t angle)
{switch(angle){case 180 :TM_SetCaptureCompare(HT_GPTM0,TM_CH_0,175); break;//对应180度case 135 :TM_SetCaptureCompare(HT_GPTM0,TM_CH_0,180); break;//对应135度case 90  :TM_SetCaptureCompare(HT_GPTM0,TM_CH_0,185); break;//对应90度case 45  :TM_SetCaptureCompare(HT_GPTM0,TM_CH_0,190); break;//对应45度case 0   :TM_SetCaptureCompare(HT_GPTM0,TM_CH_0,195); break;//对应0度}
}void Servo_Run2(uint16_t angle)
{switch(angle){case 180 :TM_SetCaptureCompare(HT_GPTM0,TM_CH_1,175); break;//对应180度case 135 :TM_SetCaptureCompare(HT_GPTM0,TM_CH_1,180); break;//对应135度case 90  :TM_SetCaptureCompare(HT_GPTM0,TM_CH_1,185); break;//对应90度case 45  :TM_SetCaptureCompare(HT_GPTM0,TM_CH_1,190); break;//对应45度case 0   :TM_SetCaptureCompare(HT_GPTM0,TM_CH_1,195); break;//对应0度}
}void Servo_Run3(uint16_t angle)
{switch(angle){case 180 :TM_SetCaptureCompare(HT_GPTM0,TM_CH_2,175); break;//对应180度case 135 :TM_SetCaptureCompare(HT_GPTM0,TM_CH_2,180); break;//对应135度case 90  :TM_SetCaptureCompare(HT_GPTM0,TM_CH_2,185); break;//对应90度case 45  :TM_SetCaptureCompare(HT_GPTM0,TM_CH_2,190); break;//对应45度case 0   :TM_SetCaptureCompare(HT_GPTM0,TM_CH_2,195); break;//对应0度}
}void Servo_Run4(uint16_t angle)
{switch(angle){case 180 :TM_SetCaptureCompare(HT_GPTM0,TM_CH_3,175); break;//对应180度case 135 :TM_SetCaptureCompare(HT_GPTM0,TM_CH_3,180); break;//对应135度case 90  :TM_SetCaptureCompare(HT_GPTM0,TM_CH_3,185); break;//对应90度case 45  :TM_SetCaptureCompare(HT_GPTM0,TM_CH_3,190); break;//对应45度case 0   :TM_SetCaptureCompare(HT_GPTM0,TM_CH_3,195); break;//对应0度}
}

main.c

#include "ht32.h"
#include "ht32_board.h"
#include "led.h"
#include "delay.h"
#include "uart.h"
#include "time.h"/******************TH32 定时器GPTM多路舵机控制*******************
Author:小殷Date:2022-4-28
***************************************************************/
int main()
{Led_Init();USARTx_Init();GPTM_PWM_init();Servo_Run(45);printf("---------pwm Test------\n");while(1){Servo_Run(0);delay_ms(500);Servo_Run(45);delay_ms(500);Servo_Run2(0);delay_ms(500);Servo_Run2(45);delay_ms(500);Servo_Run3(0);delay_ms(500);Servo_Run3(45);delay_ms(500);Servo_Run4(0);delay_ms(500);Servo_Run4(45);delay_ms(500);}
}

所需函数分析

1.首先配置我们所需的时钟、GPIO、端口复用、定时器时钟
CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};
CKCUClock.Bit.PA         = 1;       //GPIOA时钟打开
CKCUClock.Bit.AFIO       = 1;       //复用时   CKCUClock.Bit.GPTM0      = 1;
CKCU_PeripClockConfig(CKCUClock, ENABLE);      //时钟使能
AFIO_GPxConfig(GPIO_PA, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7, AFIO_MODE_4);  //开启复用功能
GPIO_DirectionConfig(HT_GPIOA,HTGPIO_PIN,GPIO_DIR_OUT);/************************定时器结构体配置*******************/
typedef struct
{TM_CH_Enum      Channel;              /*!< Channel selection refer to \ref TM_CH_Enum                     */TM_OM_Enum      OutputMode;           /*!< Channel output mode selection refer to \ref TM_OM_Enum         */TM_CHCTL_Enum   Control;              /*!< CHxO output state refer to \ref TM_CHCTL_Enum                  */TM_CHCTL_Enum   ControlN;             /*!< CHxO output state refer to \ref TM_CHCTL_Enum                  */TM_CHP_Enum     Polarity;             /*!< CHxO polarity refer to \ref TM_CHP_Enum                        */TM_CHP_Enum     PolarityN;            /*!< CHxO polarity refer to \ref TM_CHP_Enum                        */MCTM_OIS_Enum   IdleState;            /*!< CHxO polarity refer to \ref TM_CHP_Enum                        */MCTM_OIS_Enum   IdleStateN;           /*!< CHxO polarity refer to \ref TM_CHP_Enum                        */u16             Compare;              /*!< Value for CHxCCR register                                      */u16             AsymmetricCompare;    /*!< Value for CHxCCR register                                      */
} TM_OutputInitTypeDef;//配置完成后初始化函数
void TM_TimeBaseInit(HT_TM_TypeDef* TMx, TM_TimeBaseInitTypeDef* TimeBaseInit)/对于定时器的配置我们只需配置下面这几个参数就好,具体模式大家根据自己来就行//定时器时基以及计数方式初始化TimeBaseIniture.CounterMode = TM_CNT_MODE_UP;            //边沿对齐向上模式TimeBaseIniture.CounterReload = 200-1;                       //计数重装载计数器TimeBaseIniture.Prescaler = 4800 -1;                           //预分频系数TimeBaseIniture.PSCReloadTime=TM_PSC_RLD_IMMEDIATE;    //立即重装载TM_TimeBaseInit(HT_GPTM0,&TimeBaseIniture);/***********************输出比较PWM配置结构体*********************/
typedef struct
{TM_CH_Enum      Channel;              /*!< Channel selection refer to \ref TM_CH_Enum                     */TM_OM_Enum      OutputMode;           /*!< Channel output mode selection refer to \ref TM_OM_Enum         */TM_CHCTL_Enum   Control;              /*!< CHxO output state refer to \ref TM_CHCTL_Enum                  */TM_CHCTL_Enum   ControlN;             /*!< CHxO output state refer to \ref TM_CHCTL_Enum                  */TM_CHP_Enum     Polarity;             /*!< CHxO polarity refer to \ref TM_CHP_Enum                        */TM_CHP_Enum     PolarityN;            /*!< CHxO polarity refer to \ref TM_CHP_Enum                        */MCTM_OIS_Enum   IdleState;            /*!< CHxO polarity refer to \ref TM_CHP_Enum                        */MCTM_OIS_Enum   IdleStateN;           /*!< CHxO polarity refer to \ref TM_CHP_Enum                        */u16             Compare;              /*!< Value for CHxCCR register                                      */u16             AsymmetricCompare;    /*!< Value for CHxCCR register                                      */
} TM_OutputInitTypeDef;void TM_OutputModeConfig(HT_TM_TypeDef* TMx, TM_CH_Enum Channel, TM_OM_Enum Mod);
void TM_OutputInit(HT_TM_TypeDef* TMx, TM_OutputInitTypeDef* OutInit);//同样对于这个结构体的配置我们也只需配置以下参数就可以了 和相关输出初始化函数OutIniture.Channel= TM_CH_0;OutIniture.Control= TM_CHCTL_ENABLE;         //GPTM通道使能OutIniture.OutputMode=TM_OM_PWM1 ;          //GPTM 通道 PWM1输出模式  PWM2模式翻转OutIniture.Polarity= TM_CHP_INVERTED;    //GPTM 通道极性是低电平或下降沿TM_OutputModeConfig(HT_GPTM0,TM_CH_0,TM_OM_PWM1);TM_OutputInit(HT_GPTM0,&OutIniture);//上面两个结构体配置完成后 记得一定要使能定时器
void TM_IntConfig(HT_TM_TypeDef* TMx, u32 TM_INT, ControlStatus NewState);
void TM_Cmd(HT_TM_TypeDef* TMx, ControlStatus NewState);

大家配置的时候一定要仔细检查有没有漏掉的我自己在配置的时候
GPIO_DirectionConfig(HT_GPIOA,HTGPIO_PIN,GPIO_DIR_OUT);
就把GPIO输出的配置给漏掉了 搞了好久才发现这个错误

加油耶

【合泰HT32F52352GPTM多路PWM控制】相关推荐

  1. 用电位器通过STC12C2052AD单片机片内AD和PWM控制电机无极变速

    51CTO提醒您,请勿滥发广告! 用电位器通过STC12C2052AD单片机片内AD和PWM控制电机无极变速 http://51CTO提醒您,请勿滥发广告!/bbs/forum.php?mod=vie ...

  2. ZYNQ7000学习(十八)多路 PWM 原理分析以及实现试验

    多路 PWM 原理分析以及实现试验 基本原理(参考 http͗//www͘fpga4fun͘com/PWM_D_C͘html) PWM_(Pulse_Width_Modulation) A PWM t ...

  3. 一个定时器生成多路PWM波形的原理和方法成都自动化开发

    在很多工程应用中,需要使用到PWM波(脉宽调制),例如电机调速.温度控制调整功率等.本文讲述怎么利用单片机的一个定时器生成多路PWM波形. 一般的,PWM的周期t1是一个固定值,如1ms,10ms,1 ...

  4. STM32Cube的PWM控制基础篇(一)一路PWM设置

    以下是有关STM32cube的PWM的花式操作,大佬们在看下面链接之前建议先看完本博客,个人觉得写的比较详细,欢迎大佬之指正! STM32Cube的PWM控制基础篇(二)多路占空比不同的PWM STM ...

  5. STM32Cube的PWM控制应用篇(二)用两个个定时器生成三个相位差120度的等效正弦波

    STM32Cube的PWM控制基础篇(一)一路PWM设置 STM32Cube的PWM控制基础篇(二)多路占空比不同的PWM STM32Cube的PWM控制基础篇(三)定时器的PWM设置详解 STM32 ...

  6. python舵机控制程序_树莓派PWM控制舵机的两种方式

    PWM控制舵机简介 通常情况下,伺服电机(舵机)是由一个标准的直流系统和一个内部反馈控制装置(一个减速齿轮和电位计)来组成的.伺服电机(舵机)的主要作用是将齿轮轴旋转到一个预定义的方向上.伺服电机(舵 ...

  7. 基于FPGA的直流电机PWM控制+毕业论文

    基于FPGA的直流电机PWM控制+开题+毕业论文+源码(VHDL or verilog) 基于FPGA的直流电机PWM控制电路主要由四部分组成:控制命令输入模块.控制命令处理模块.控制命令输出模块.电 ...

  8. STM32通用定时器输出PWM控制舵机 —— 重装载值、比较值、当前值

    参考:stm32 定时器输出PWM原理及工作原理+控制舵机 作者:点灯小哥 发布时间: 2021-03-09 23:17:52 网址:https://blog.csdn.net/weixin_4601 ...

  9. stm32电机控制定时器1_STM32通过PWM控制电机速度

    做STM32智能小车的实验中会用到定时器PWM输出,来改变直流电机的转速.分享本文了解如何通过PWM实现对电机速度的控制. PWM控制电机速度的基本原理 PWM(Pulse Width Modulat ...

最新文章

  1. pyqt 照片打上水印
  2. 关于在Android中一个XML文件包含另外一个XML的方法
  3. uniapp H5页面打包发布
  4. navacat无法打开excel解决
  5. 【算法】LSM-tree 基本原理及应
  6. ZOJ 2760 How Many Shortest Path 最大流+floyd求最短路
  7. 李炎恢的课程中心(JQUERY视频)
  8. Thrift源码分析(二)-- 协议和编解码
  9. 一款微信小程序商城项目(附源码)
  10. (附源码)springboot菠萝大学课室预约系统分析与设 毕业设计 641656
  11. 鸿蒙OS分布式任务调度,鸿蒙子系统解读-分布式任务调度篇(下)
  12. android 采集音频输出,Android系统分析之Audio音频流, 音频策略, 输出设备之间的关系...
  13. 公网远程访问内网群晖NAS 7.X版 【内网穿透】
  14. 在Ubuntu安装完成后更改默认的语言LANG,出现Cannot set LC_CTYPE to default locale: No such file or directory错误的解决办法
  15. 半年从转行软件测试到产品经理
  16. 利用springcloud搭建一个简易的分布式简历展示系统
  17. zooomcharts的使用 (1.18.8版本 + ts )
  18. android5.1设置ip,android5.1 imx6q接并口摄像头(IPU1-CSI1)怎么配置
  19. AD将原理图转换成彩色或者黑白PDF,主要是依据页面设计中的色彩设置黑白或者彩色打印。打印机中的高级设置或者属性设置中的色彩黑白或者彩色不起作用(亲自测试)
  20. 地级市固定资产投资和对外经济贸易指标

热门文章

  1. 背部肌群介绍:肌肉图示和英文名称
  2. 文顶顶iOS开发博客链接整理及部分项目源代码下载
  3. Android Studio 3.6.1 Marven 连不上
  4. go test 初始化--- TestMain的使用
  5. WWDC 2020 特别活动主题演讲 全套源文件下载 视频、幻灯片图片、中英文全稿 WWDC 2020 Special Event Keynote
  6. HOG+SVM行人检测python实现
  7. Phoenix客户端Squirrel安装
  8. 实现百度搜索框提示语功能
  9. PB 产程进展图 下载
  10. 前端搭建名言生成器(内附源码)