[mw_shl_code=c,true]#include "stm32f10x.h"
#include <OS_Config.h>
extern int read_D(u16 ndata,u8 dbit);
extern void write_D(u16 ndata,u8 dbit,int d);
extern u16 read_M(u16 ndata);
extern void write_M(u16 ndata,u8 mbit );
extern void BSP_pwm(void);
extern void BSP_IO(void);
extern void PWM(void );
vu16 CCR1_Val = 695; /* 初始化输出比较通道1计数周期变量*/
vu16 CCR2_Val = 20000; /* 初始化输出比较通道2计数周期变量*/
vu16 CCR3_Val = 10000; /* 初始化输出比较通道3计数周期变量*/
vu16 CCR4_Val = 5000; /* 初始化输出比较通道4计数周期变量*/
u32 arr,psc,psc1;
u8 pwm,pwm1,PLSY_0,Y0_d32;
u8 D32,W0,P0,P1; //D32 PLSY/DPLSY切换,W0开写当前脉冲数,P0 P1 频率大于小于1000切换
/***********************配置RCC寄存器组,使用PLL输出72MHz时钟并作为主时钟源***********************************/
void RCC_Configuration(void)//设置系统各部分时钟
{
/* 定义枚举类型变量 HSEStartUpStatus */
ErrorStatus HSEStartUpStatus;
/* 复位系统时钟设置*/
RCC_DeInit();
/* 开启HSE*/
RCC_HSEConfig(RCC_HSE_ON);
/* 等待HSE起振并稳定*/
HSEStartUpStatus = RCC_WaitForHSEStartUp();
/* 判断HSE起是否振成功,是则进入if()内部 */
if(HSEStartUpStatus == SUCCESS)
{
/* 选择HCLK(AHB)时钟源为SYSCLK 1分频 */
RCC_HCLKConfig(RCC_SYSCLK_Div1);
/* 选择PCLK2时钟源为 HCLK(AHB) 1分频 */
RCC_PCLK2Config(RCC_HCLK_Div1);
/* 选择PCLK1时钟源为 HCLK(AHB) 2分频 */
RCC_PCLK1Config(RCC_HCLK_Div2);
/* 选择锁相环(PLL)时钟源为HSE 1分频,倍频数为9,则PLL输出频率为 8MHz * 9 = 72MHz */
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
/* 使能PLL */
RCC_PLLCmd(ENABLE);
/* 等待PLL输出稳定 */
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
/* 选择SYSCLK时钟源为PLL */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
/* 等待PLL成为SYSCLK时钟源 */
while(RCC_GetSYSCLKSource() != 0x08);
}
/* 打开 TIM2 时钟 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
/* 打开 APB 总线上的 GPIOA,USART1 时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
}
void TIM_Configuration(void)
{
/* 定义 TIM_TimeBase 初始化结构体 TIM_TimeBaseStructure */
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
/* 定义 TIM_OCInit 初始化结构体 TIM_OCInitStructure */
TIM_OCInitTypeDef TIM_OCInitStructure;
/*
* 计数重载值为65535
* 预分频值为(7199 + 1 = 7200)
* 时钟分割0
* 向上计数模式
*/
TIM_TimeBaseStructure.TIM_Period = 65535; //如TIM_Period = 0x3E7则波形频率为TIMCLK/(0x3E7+1)
// 且只要TIM_Period 不为零,则其TIMCLK为系统频率的一半
if (arr > 1000)TIM_TimeBaseStructure.TIM_Prescaler = 0; //分频 TIMCLK/(0x3E7+1)/(TIM_Prescaler+1)
if (arr <= 1000)TIM_TimeBaseStructure.TIM_Prescaler = 999; //分频 TIMCLK/(0x3E7+1)/(TIM_Prescaler+1)
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2 , &TIM_TimeBaseStructure);
/*
* 设置 OC1,OC2,OC3,OC4 通道
* 工作模式为计数器模式
* 使能比较匹配输出极性
* 时钟分割0
* 向上计数模式
*/
//TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
// TIM_SelectOnePulseMode(TIM2, TIM_OPMode_Single); //只输出一个脉冲
TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
// TIM_OCInitStructure.TIM_Pulse = CCR2_Val;
// TIM_OC2Init(TIM2, &TIM_OCInitStructure);
//
// TIM_OCInitStructure.TIM_Pulse = CCR3_Val;
// TIM_OC3Init(TIM2, &TIM_OCInitStructure);
//
// TIM_OCInitStructure.TIM_Pulse = CCR4_Val;
// TIM_OC4Init(TIM2, &TIM_OCInitStructure);
/* 禁止预装载寄存器 */
TIM_OC1PreloadConfig(TIM2 , TIM_OCPreload_Disable);//若没有禁止预装载寄存器,则每次计数至65525过程中
//总在当前固定值处发生计数比较匹配事件,并请求计数比较匹配中断,执行中断服务函数*
// TIM_OC2PreloadConfig(TIM2 , TIM_OCPreload_Disable);
// TIM_OC3PreloadConfig(TIM2 , TIM_OCPreload_Disable);
// TIM_OC4PreloadConfig(TIM2 , TIM_OCPreload_Disable);
// TIM_ITConfig(TIM2 , TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4 , ENABLE);
TIM_ARRPreloadConfig(TIM2, ENABLE);
TIM_ITConfig(TIM2 , TIM_IT_CC1, ENABLE);
}
void PWM(void )
{
if (PLSY_0 == 1) //脉冲启动
{
if(W0 == 0)
{
if(Y0_d32 == 0)write_D (8140,1,psc1/2),W0 = 1; //当前脉冲数
else write_D (8140,2,psc1/2),W0 = 1; //当前脉冲数
}
if (arr > 1000)
{
CCR1_Val = 36000000/arr ;
if (P0 == 0) TIM_Cmd(TIM2 , DISABLE ),pwm = 0,P0 = 1,P1 = 0;
}
if (arr <= 1000)
{
CCR1_Val = 36000/arr ;
if (P1 == 0) TIM_Cmd(TIM2 , DISABLE ),pwm = 0,P1 = 1,P0 = 0;
}
/* 启动 TIM 计数 */
if (pwm == 0)
{
Y00 = 1;
BSP_pwm ();
TIM_Configuration();
TIM_Cmd(TIM2 , ENABLE);
pwm = 1;
pwm1 = 1;
}
}
else
{
TIM_Cmd(TIM2 , DISABLE );
if(Y0_d32 == 0)psc1 = read_D (7900,1)*2;
else psc1 = read_D (7900,2)*2;
pwm = 0;
if (pwm1 == 1)
{
pwm1 = 0;
BSP_IO ();
Y00 = 1;
}
}
}
static void PLSY(void)
{
u8 H0,H1,H2,H3,L0,L1,L2,L3;
u16 S1,S2;
u8 S3,S4;
H0 = *p_prog/0x100,L0 = *p_prog%0x100,p_prog++;
H1 = *p_prog/0x100,L1 = *p_prog%0x100,p_prog++;
H2 = *p_prog/0x100,L2 = *p_prog%0x100,p_prog++;
H3 = *p_prog/0x100,L3 = *p_prog%0x100,p_prog++;
if (*p_prog/0x100 == 0x84)S3 = *p_prog%0x100,p_prog++;
else p_prog++;
if (*p_prog/0x100 == 0x80)S4 = *p_prog%0x100,p_prog++;
else p_prog++;
if(H0 == 0x86) //D
{
if (H1 == 0x86) S1 = (L0 + L1 * 256)/2; //D<1000
if (H1 == 0x88) S1 = (L0 + L1 * 256)/2 + 1000; //D>=1000
}
if ((H0 == 0x80 || H0 == 0x82) && H1 == 0x80) S1 = (L0 + L1 * 256);
if(H2 == 0x86) //D
{
if (H3 == 0x86)S2 = (L2 + L3 * 256)/2;
if (H3 == 0x88) S2 = (L2 + L3 * 256)/2 + 1000;
}
if ((H2 == 0x80 || H2 == 0x82) && H3 == 0x80) S2 = (L2 + L3 * 256);
if((process_value&0X01)==0X01)
{
if (H0 == 0x86 && (H1 == 0x86 || H1 == 0x88)) arr = read_D (S1,1);
if ((H0 == 0x80 || H0 == 0x82) && H1 == 0x80) arr = S1; //常数
if(S3 == 0x00 && S4 == 0x05) PLSY_0 = 1,Y0_d32 = 0;
}
else
{
if (H2 == 0x86 && (H3 == 0x86 || H3 == 0x88)) psc = read_D (S2,1)*2;
if ((H2 == 0x80 || H2 == 0x82) && H3 == 0x80) psc = S2*2; //常数
PLSY_0 = 0;
}
}[/mw_shl_code]
arr 是频率 psc是脉冲数
1~数百KHz可调
|