高中生
最后登录1970-1-1
在线时间 小时
注册时间2018-3-30
|
【新手一枚,求助】霸道无法配置TIM8
现象描述:
1、使用固件库例程进行仿真OK,将端口改为TIM8的chanel 2进行PWM互补输出,编译通过,仿真无结果,大家有无解法?
#ifndef __Andin_PWM_H
#define __Andin_PWM_H
#include "stm32f10x.h"
//PWM GPIO端口定义 默认GPIOC_Pin_7
#define PWM_GPIO_Pin GPIO_Pin_7
#define PWM_GPIO_Port GPIOC
#define PWM_GPIO_CLK (RCC_APB2Periph_GPIOC)
#define PWM_GPIO_APBxClkCmd RCC_APB2PeriphClockCmd
//TIMx端口以及时钟
#define PWM_TIMx_APBxClkCmd RCC_APB2PeriphClockCmd
#define TIMx_RCC_APB2Periph RCC_APB2Periph_TIM8
#define PWM_Period 1000 //定义信号周期系数
#define PWM_PSC (7200-1) //定义时钟分频系数
#define PWM_Pulse 500 //定义CCR数值
#define PWM_TIMx TIM8 //定义PWM时钟
#define PWM_TIM_OCxInit TIM_OC2Init //定义输出比较通道
#define PWM_OCx_Preload_Config TIM_OC2PreloadConfig //配置OCx预加载CCR值
#define PWM_IRQ TIM8_UP_IRQn //配置PWM计数器中断类型
#define PWM_IRQHandler TIM8_UP_IRQHandler //配置PWM计数器中断类型
void PWM_TIM_Init(void);
#endif /* __Andin_PWM_H */
------------------------------------------------------------------------------------------------------------
#include "../User/PWM/Andin_PWM.h"
/*
*@ 设置PWM的GPIO结构体以及初始化
*/
static void PWM_TIM_GPIO_Config(void)
{
GPIO_InitTypeDef PWM_GPIO_StruInit; //GPIO口定义
PWM_GPIO_StruInit.GPIO_Mode = GPIO_Mode_AF_PP;//比较输出时使用AF_PP
PWM_GPIO_StruInit.GPIO_Pin = PWM_GPIO_Pin;//定义GPIO Pin
PWM_GPIO_StruInit.GPIO_Speed = GPIO_Speed_50MHz;//定义GPIO速率
GPIO_Init(PWM_GPIO_Port,&PWM_GPIO_StruInit);//GPIO结构体初始化
PWM_GPIO_APBxClkCmd(PWM_GPIO_CLK,ENABLE);//开启PWM对应的GPIO口时钟
}
/*
*@ 设置PWM的时钟模式
*/
static void PWM_TIM_Mode_Config(void)
{
PWM_TIMx_APBxClkCmd(TIMx_RCC_APB2Periph,ENABLE); //开启TIMx时钟
/***********************1.设置时基结构体并初始化***********************/
TIM_TimeBaseInitTypeDef PWM_TimeBaseInit; //时基结构定义
PWM_TimeBaseInit.TIM_ClockDivision = TIM_CKD_DIV1; //时基预分频系数,当使用刹车/死区时间时定义
PWM_TimeBaseInit.TIM_CounterMode = TIM_CounterMode_Up;//定时器向上计数
PWM_TimeBaseInit.TIM_Period = PWM_Period;//定义ARR寄存器,即决定信号周期
PWM_TimeBaseInit.TIM_Prescaler = PWM_PSC;//设定计数器分频因子,决定计数器周期
PWM_TimeBaseInit.TIM_RepetitionCounter = 0;//自动重载不需要设定
TIM_TimeBaseInit(PWM_TIMx,&PWM_TimeBaseInit);//初始化时基结构体
/**********************************************************************/
/***********************2.设置输出比较结构体并初始化***********************/
TIM_OCInitTypeDef PWM_OC_StruIinit; //输出比较结构定义
PWM_OC_StruIinit.TIM_OCIdleState= TIM_OCIdleState_Reset;//定义正向输出空闲状态时输出低电平
PWM_OC_StruIinit.TIM_OCMode= TIM_OCMode_PWM1;//定义输出比较模式为PWM1模式
PWM_OC_StruIinit.TIM_OCNIdleState=TIM_OCNIdleState_Reset;//定义反向输出空闲状态时输出低电平
PWM_OC_StruIinit.TIM_OCNPolarity=TIM_OCNPolarity_High;//定义反向出发电平为高电平
PWM_OC_StruIinit.TIM_OCPolarity=TIM_OCPolarity_High;//定义正向出发电平为高电平
PWM_OC_StruIinit.TIM_OutputNState=TIM_OutputNState_Enable;//禁用反向输出
PWM_OC_StruIinit.TIM_OutputState=TIM_OutputState_Enable;//使能正向输出
PWM_OC_StruIinit.TIM_Pulse=PWM_Pulse;//对占空比参数进行定义
PWM_TIM_OCxInit(PWM_TIMx,&PWM_OC_StruIinit);//输出比较通道初始化
PWM_OCx_Preload_Config(PWM_TIMx,TIM_OCPreload_Enable);//输出比较CCR预加载使能
/**********************************************************************/
/****************************3. 其它使能设置****************************/
TIM_Cmd(PWM_TIMx,DISABLE);//时钟使能
TIM_CtrlPWMOutputs(PWM_TIMx,ENABLE);//PWM主输出使能
TIM_ITConfig(PWM_TIMx, TIM_IT_Update, ENABLE);//使能update中断
}
/**********************************************************************/
/*--------------------------4. 中断等级函数设定--------------------------*/
static void PWM_NVIC_Config(void)
{
NVIC_InitTypeDef PWM_NVIC_InitStructure;
/* 嵌套向量中断控制器组选择 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/* 配置USART为中断源 */
PWM_NVIC_InitStructure.NVIC_IRQChannel = PWM_IRQ;
/* 抢断优先级*/
PWM_NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
/* 子优先级 */
PWM_NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
/* 使能中断 */
PWM_NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
/* 初始化配置NVIC */
NVIC_Init(&PWM_NVIC_InitStructure);
}
/*----------------------------------------------------------------------*/
/*---------------------------5. PWM时钟初始化----------------------------*/
void PWM_TIM_Init(void)
{
PWM_NVIC_Config();
PWM_TIM_GPIO_Config();
PWM_TIM_Mode_Config();
}
/*----------------------------------------------------------------------*/
-------------------------------------------------------------------------------------
2.如果直接配置为PA8 chanel 1,仿真OK,但是下载到开发板,没有办法驱动L289N全桥电路,电机不转。
思路 PA8控制速度(PA8->update中断->CCR赋新值->清除中断->循环...),PC8、PC9控制正反转。
接线如下:
PA8 --> ENA (PWM)
PC8 -> IN1 (正或负,与PC9反相)
PC9 -> IN2 (正或负,与PC8反相)
SDIO GND -> L289N GND (要求必须接地)
out1 ->直流电机端子1
out2 ->直流电机端子2
新手一枚,请多多包涵~
|
|