用STM32F103的PWM驱动直流电机,程序下载运行是OK的。
重新上电后,PWM不输出
不知道什么原因
#include "stm32f10x.h"
/**
* @brief 配置
tiM复用输出PWM时用到的I/O
* @param 无
* @retval 无
*/
static void TIM_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* 使能定时器通道引脚GPIO时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
/* 配置定时器通道1输出引脚模式:复用推挽输出模式 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/**
* @brief 配置TIM输出的PWM信号的模式,如周期、极性、占空比
* @param 无
* @retval 无
*/
/**
* TIMxCLK/CK_PSC --> TIMxCNT --> TIMx_ARR --> TIMxCNT 重新计数
* TIMx_CCR(电平发生变化)
* 信号周期=(TIMx_ARR +1 ) * 时钟周期
* 占空比=TIMx_CCR/(TIMx_ARR +1)
*/
static void TIM_Mode_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
/* 使能定时器时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
/* 定时器基本参数配置 */
TIM_TimeBaseStructure.TIM_Period = 100 - 1; //自动重装载计数器 100即为20k一个定时周期
TIM_TimeBaseStructure.TIM_Prescaler = 36 - 1; //预分频:36
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ; //设置时钟分频系数:不分频(这里用不到)
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; //复位计数器
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
/* 模式配置 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //配置为PWM模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //输出状态设置:使能输出
TIM_OCInitStructure.TIM_Pulse = 10; //设置跳变值,当计数器计数到这个值时,电平发生跳变
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //当定时器计数值小于CCR1_Val时为高电平
TIM_OC1Init(TIM1, &TIM_OCInitStructure); //初始化通道1
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //使能通道1
TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIM重载寄存器ARR
TIM_CtrlPWMOutputs(TIM1, ENABLE); //TIM主输出使能
TIM_Cmd(TIM1, ENABLE); //使能TIM
}
/**
* @brief 主函数
* @param 无
* @retval 无
*/
int main(void)
{
TIM_GPIO_Config();//GPIO初始化
TIM_Mode_Config();//TIM PWM输出初始化
while(1)
{
//add your code here ^_^*
}
}
一周热门 更多>