#include "PWM.h"
#include "SysTick_delay.h"
#include "Sensor.h"
#include "time.h"
#include "Motor_Step.h"
#include "main.h"
/************************************PWM总结******************************************
通过引脚的复用功能设置成输出模式
通过该引脚的复用时钟通道,设置相应模式
使该引脚输出想要的电压,即可控电压输出
*************************************************************************************/
//---------------------------------------------自己测试---------------------------------
/*用TIM2—CH2设置PWM自已练习应用实现相同的功能*/
//注意:PWM输出口配置为推挽输出,原因不知道,
//下面是TIM配置函数,
//除了TIM6与TIM7之外,其它定时器都可以产生PWM信号
//TIM5_CH2/TIM2_CH2的PWM通道连接PA1
/*
void TIM3_PWM4_Configuration(void) //初始化TIM3_CH4
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TimOCInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
//PC9引脚配置 TIM3_CH4
//---------------------------------//引脚配置函数-----------------
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);// | RCC_APB2Periph_AFIO
//原本无法输出波形,原因为PC9的TIM3_CH4功能为重定义功能也就是要重映射,
//如果不使能TIM3的重映射功能,TIM3将无法使用
GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE); //使能TIM3部分重映射
//
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
//---------------------------------//TIM配置函数-----------------
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_DeInit(TIM3);
TIM_InternalClockConfig(TIM3);
//预分频系数为72,这样计数器时钟为72MHz/72 = 1MHz
TIM_TimeBaseStructure.TIM_Prescaler = 719;//分频,100KHZ
//设置计数溢出大小,第计100个数就产生一个更新事件
TIM_TimeBaseStructure.TIM_Period = 100;//100;//
//设置时钟分割 不分频
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
//向上计数模式
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_RepetitionCounter=1;
//将配置应用到TIM5
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
//禁止ARR预装载缓冲器
// TIM_ARRPreloadConfig(TIM3, ENABLE);
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //开始计数溢出中断
TIM_Cmd(TIM3, ENABLE); //使能TIM5外设
//---------------------------------关键的PWM配置函数-----------------
//设置缺省值
TIM_OCStructInit(&TimOCInitStructure);
//PWM模式1输出
TimOCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//脉冲宽度调制模式1
//设置占空比,占空比=(CCRx/ARR)*100%或(TIM_Pulse/TIM_Period)*100%
TimOCInitStructure.TIM_Pulse = 50; //pwm_value-1;// pwm_value 800-1 占空时间
//TIM输出比较极性高
TimOCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
//使能输出状态
TimOCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
//TIM5的CH2输出
TIM_OC4Init(TIM3, &TimOCInitStructure);
TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);
//设置TIM5的PWM输出为使能
TIM_CtrlPWMOutputs(TIM3,ENABLE);
}
*/
/*********************************************************************************
* 32中断理解:抢占优先级的级别高于响应优先级,而数值越小所代表的优先级就越高
* 1 如果抢占优先级与响应优先级完全相同,则看哪个中断先发生就先执行谁
* 2 高优先级的抢占优先级可以打断正在进行的低抢占优先级中断
* 3 相同抢占优先级的中断,高的响应优先级不可以打断正在执行的低响应优先级中断
**********************************************************************************/
//-------------------------设置TIM3(定时和延时使用)---------------------------------------
/*
void TIM3_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
//W 一定要打开TIM的时钟,不然中断不会工作
RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3, ENABLE);
// Enable the TIM2 Interrupt
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn ;//TIM8_CC_IRQn ;//捕捉和比较中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//定时时间= (1 + arr)* (1 + psc)/Tclk 计算方式
//TIM4基本设置
//设置预分频器分频系数71,即APB1=72M, TIM4_CLK=72/72=1MHz
//TIM_Period(TIM4_ARR)=1000,计数器向上计数到1000后产生更新事件,计数值归零
//向上计数模式
//TIM_RepetitionCounter(TIM2_RCR)=0,每次向上溢出都产生更新事件
TIM_TimeBaseStructure.TIM_Period = 719;// 2; 0.1Ms//arr
TIM_TimeBaseStructure.TIM_Prescaler = 100; //psc
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割//TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
// TIM enable counter
TIM_Cmd(TIM3, ENABLE);
TIM_ITConfig(TIM3, TIM_IT_Update, DISABLE );//没有关中断所以一上电就会开始计时
}
void TIM3_START(void)
{
//清中断,以免一启用中断后立即产生中断
TIM_ClearFlag(TIM3, TIM_FLAG_Update);
//使能TIM4中断源
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
//TIM4总开关:开启
TIM_Cmd(TIM3, ENABLE);
TIM_SetCounter(TIM3, 0);
}
//W 清除定时器计数器
void TIM3_ClearCounter(void)
{
TIM_SetCounter(TIM3, 0);
}
void TIM3_END(void)
{
TIM_ITConfig(TIM3, TIM_IT_Update, DISABLE);
TIM_Cmd(TIM3, DISABLE);
}
void TIM3_IRQHandler (void)
{
// TIM3ms ++;//每100US加1
// TIM3us ++;//每100US加1
// TimingDelay_Decrement();
// if(TIM3ms == 100)//每10MS进入一次
// {
// TIM3ms = 0;
// RunTime1 ++;
// PassTime ++;
// }
TIM_ClearITPendingBit(TIM3, TIM_FLAG_Update); //清中断 原因为每次定时器溢出后进入中断,所以要清中断
}
*/
/*通过PWM与定时器中断,产生可调频率的方波的原理为:利用改变定时器输出比较通道的捕获值,
当输出通道捕获值产生中断时,在中断中将捕获值改变,这时,输出的I/O会产生一个电平翻转,
利用这种办法,实现不同频率的PWM输出*/
/*此处配置,以及应用的频率范围为,预分频后为6MHZ,装载值为65535,设置的捕获比较值为
830时,频率为1.1KHZ左右,时间为900US,在比较值为120时,频率为8.4KHZ,120US,此时625转/min
要求400转/min, 170此时440转/min*/
//步进电机4细分,800个脉冲一转
//注意:在计算PWM频率的时候,TIMX的时钟都是72MHZ,分频后,因为翻转两次才能形成一个PWM
//波,因为,PWM的频率是捕获改变频率的1/2
//Value: 设置TIM3捕获比较4寄存器
//capture:获得的TIM3的捕获值
u16 Value, capture;//830;// num,
//W 清除定时器计数器
void TIM3_ClearCounter(void)
{
TIM_SetCounter(TIM3, 0);
}
//关闭定时器
void TIM3_END(void)
{
// TIM_ITConfig(TIM3, TIM_IT_Update, DISABLE);
TIM_ITConfig(TIM3, TIM_IT_CC4 , DISABLE);
TIM_Cmd(TIM3, DISABLE);
}
void TIM3_START(void)
{
//清中断,以免一启用中断后立即产生中断
TIM_ClearFlag(TIM3, TIM_FLAG_Update);
//使能TIM4中断源
TIM_ITConfig(TIM3, TIM_IT_CC4, ENABLE);
//TIM4总开关:开启
TIM_Cmd(TIM3, ENABLE);
TIM_SetCounter(TIM3, 0);
}
void TIM3_IRQHandler(void)
{
if (TIM_GetITStatus(TIM3, TIM_IT_CC4) != RESET)
{
if(MoStep_stop == 255)
{
if(TOPorInit == 0)//运行到初始位
{
if(SwP33_CardSlot_Up != 0 )//&& OptP43_End != 1 && OptP42_Mid != 1)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_CC4);
capture = TIM_GetCapture4(TIM3);
TIM_SetCompare4(TIM3, capture + Value);
}
else
{
delay_us(2000);
TB6600_EN2(0);
// TIM3_ClearCounter();
TIM3_END();
}
}
else//运行到把机头抬起把卡槽拿出
{
if(SwP34_Cassette_Out != 0)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_CC4);
capture = TIM_GetCapture4(TIM3);
TIM_SetCompare4(TIM3, capture + Value);
}
else
{
delay_us(2000);
TB6600_EN2(0);
// TIM3_ClearCounter();
TIM3_END();
}
}
}
else
{
MoStep_stop ++;////用于在微动开关处,运行时,由于微动开关闭合无法运行
TIM_ClearITPendingBit(TIM3, TIM_IT_CC4);
capture = TIM_GetCapture4(TIM3);
TIM_SetCompare4(TIM3, capture + Value);
}
}
if(Value > 170)
{
Value = Value - 3;//分240步加速
}
评论1