003_飞控_PWM_out

本文档详细介绍了使用STM32F4微控制器进行飞控板的8路PWM输出。内容涵盖寄存器配置、参考手册以及相关的pwm.h和pwm.c源代码文件。PWM输出与电路设计相结合,提供了飞控系统的完整解决方案。
摘要由CSDN通过智能技术生成
  • 寄存器版本
    参考手册:
    STM32F4xx中文参考手册.pdf
    STM32F405xx,STM32F407xx.pdf
  • pwm.h
#ifndef __PWM_H
#define __PWM_H
#include "sys.h" 
 //模块使能宏
#define TIM1_NUM 1 
#define TIM5_NUM 1

#define PWM1  TIM1->CCR1   
#define PWM2  TIM1->CCR2  
#define PWM3  TIM1->CCR3   
#define PWM4  TIM1->CCR4  

#define PWM5  TIM5->CCR1   
#define PWM6  TIM5->CCR2  
#define PWM7  TIM5->CCR3   
#define PWM8  TIM5->CCR4  

//输出通道初始化
void out_pwm_io_init(u16 arr,u16 psc);
//TIM PWM输出
void setPwm(uint16_t num0,uint16_t num1,uint16_t num2,uint16_t num3);
#endif


  • pwm.c
#include"pwm.h"

void out_pwm_io_init(u16 arr,u16 psc)
{
	#if TIM1_NUM==1
	/*******	TIM1  CH1_E9	CH2_E11 CH3_E13 CH4_E14			*******/
	RCC->AHB1ENR|=1<<4;
	RCC->APB2ENR|=1<<0;
	GPIO_Set(GPIOE,PIN9|PIN11|PIN13|PIN14,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);
	GPIO_AF_Set(GPIOE,9|11|13|14,1);
	
	TIM1->ARR=arr;   //设定计数器自动重装值
	TIM1->PSC=psc;  //设定预分频系数
	
	TIM1->CCMR1 |=6<<4; //CH1 PWM1 模式
	TIM1->CCMR1 |=6<<12; //CH2 PWM1 模式
	TIM1->CCMR2 |=6<<4;	//CH3 PWM1
	TIM1->CCMR2 |=6<<12;//CH4 PWM1
	
	TIM1->CCMR1 |=1<<3; // ch1预装载使能
	TIM1->CCMR1 |=1<<11; // ch2预装载使能
	TIM1->CCMR2 |=1<<3;// ch3预装载使能
	TIM1->CCMR2 |=1<<11;// ch4预装载使能
	/****/
	TIM1->EGR|=1<<0;  //ug位置一  不知道加这一句有什么用 看手册需要加
	
	TIM1->CCER |=1<<0;  //oc1  输出使能
	TIM1->CCER |=0<<1;   //oc1 高电平有效
	TIM1->CCER |=1<<4;   //CH2输出使能	
	TIM1->CCER |=0<<5;   //oc2 高电平有效	
	TIM1->CCER |=1<<8;   //CH3输出使能	
	TIM1->CCER |=0<<9;   //oc3 高电平有效	
	TIM1->CCER |=1<<12;   //CH4输出使能	
	TIM1->CCER |=0<<13;   //oc4 高电平有效	
	//TIM4->BDTR |= 1<<15;       //TIM1必须要这句话才能输出PWM
	TIM1->CR1|=1<<7;  //arpe使能
	TIM1->CR1|=1<<0;  //使能定时器4
	
	#endif
	
#if TIM5_NUM==1 	
	
	//	TIM5  CH1_A0	CH2_A1 CH3_A2 CH4_
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在PX4飞控中,PWM控制代码主要负责控制电调输出的PWM信号,以控制电机转速。以下是一个简单的PWM控制代码示例: ```c++ #include <px4_platform_common/px4_config.h> #include <px4_platform_common/tasks.h> #include <drivers/drv_pwm_output.h> int main(int argc, char *argv[]) { // 初始化PWM输出 px4_arch_configgpio(GPIO_PWM_OUT1); px4_arch_configgpio(GPIO_PWM_OUT2); px4_arch_configgpio(GPIO_PWM_OUT3); px4_arch_configgpio(GPIO_PWM_OUT4); // 配置PWM输出通道参数 struct pwm_output_values pwm_values; pwm_values.channel_count = 4; pwm_values.default_value = 1000; pwm_values.values[0] = 1000; pwm_values.values[1] = 1000; pwm_values.values[2] = 1000; pwm_values.values[3] = 1000; ioctl(PWM_OUTPUT_GET_CHANNEL_COUNT, 0, (unsigned long)&pwm_values); // 控制PWM输出 while (true) { pwm_values.values[0] = 1200; pwm_values.values[1] = 1300; pwm_values.values[2] = 1400; pwm_values.values[3] = 1500; ioctl(PWM_OUTPUT_SET_SAFETY_LOCK, 0); ioctl(PWM_OUTPUT_SET_ARM_OK, 0); ioctl(PWM_OUTPUT_SET_DISARMED_PWM, 0, pwm_values.default_value); ioctl(PWM_OUTPUT_SET_MODE, PWM_OUTPUT_MODE_ONESHOT); ioctl(PWM_OUTPUT_SET_CONFIG, 0, (unsigned long)&pwm_values); ioctl(PWM_OUTPUT_UPDATE_CHANNELS, 0, (unsigned long)&pwm_values); usleep(20000); } return 0; } ``` 在上述示例代码中,首先通过调用`px4_arch_configgpio`函数初始化PWM输出引脚,然后配置PWM输出通道参数。在控制PWM输出时,通过调用`ioctl`函数设置PWM输出的安全锁、启动状态、解锁时的PWM值、输出模式和输出参数,最后通过调用`ioctl`函数更新PWM输出值。 需要注意的是,上述示例代码中的PWM输出值仅作为示例,实际应用中需要根据具体需求进行调整。同时,为了保证PWM输出的稳定性和安全性,通常需要在飞控系统中实现一些保护机制,如输出PWM频率限制、输出值范围限制等。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值