找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1731|回复: 0
打印 上一主题 下一主题
收起左侧

STM8寄存器PWM

[复制链接]
跳转到指定楼层
楼主
ID:369924 发表于 2018-7-12 09:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "iostm8s208mb.h"//主控芯片的头文件
/************************常用数据类型定义******************/
#define u8  uint8_t
#define u16 uint16_t
#define u32 uint32_t
typedef unsigned char    uint8_t;
typedef unsigned short   uint16_t;
typedef unsigned long    uint32_t;
/*************************函数声明区域*********************/

#define KEY4    PI_IDR_IDR0      // PWM档位控制


void GPIO_init();
void delay(u16 Count);//延时函数声明
void TIM1_PWM_SET(unsigned long F_PWM_SET);
//TIM1输出比较功能初始化函数声明
void CH1_PWM_SET(unsigned long F_SET_CH1,float Duty_CH1);
//TIM1_CH1通道PWM信号输出配置函数声明
void CH2_PWM_SET(unsigned long F_SET_CH2,float Duty_CH2);
//TIM1_CH2通道PWM信号输出配置函数声明
void CH3_PWM_SET(unsigned long F_SET_CH3,float Duty_CH3);
//TIM1_CH3通道PWM信号输出配置函数声明
void CH4_PWM_SET(unsigned long F_SET_CH4,float Duty_CH4);
//TIM1_CH4通道PWM信号输出配置函数声明
/**************************主函数区域**********************/
int main(void)
{
  GPIO_init();
  CLK_CKDIVR=0x00;//设置系统时钟为HSI内部高速16MHz时钟
  delay(10);//延时等待稳定

  TIM1_PWM_SET(16000);//TIM1输出比较功能初始化配置
  while(1)
  {
    //添加用户自定义代码
  }
}
/****************************************************************/
//延时函数delay(),有形参Count用于控制延时函数执行次数,无返回值
/****************************************************************/
void delay(u16 Count)
{
  u8 i,j;
  while (Count--)//Count形参控制延时次数
  {
    for(i=0;i<50;i++)
      for(j=0;j<20;j++);
  }
}
/****************************************************************/
//TIM1输出比较功能初始化函数TIM1_init(),有形参F_PWM_SET,无返回值
/****************************************************************/
void TIM1_PWM_SET(unsigned long F_PWM_SET)  //用于控制功率 高中低
{
    double PWM_abc[]={0.9,0.6,0.3};
      u16 num;

        TIM1_ARRH=F_PWM_SET/256; //配置自动重装载寄存器高位“ARRH”
        TIM1_ARRL=F_PWM_SET%256; //配置自动重装载寄存器低位“ARRL”
        TIM1_CR1&=0x8F;          //向上计数模式边沿对齐
        while(1)
      {   

        if(KEY4==0)
        {
          delay(20);
          if(KEY4==0)
          {
             while(!KEY4);
            num++;
          }
            switch(num)
            {
            case 1:    TIM1_ARRH=F_PWM_SET/256; //配置自动重装载寄存器高位“ARRH”
                        TIM1_ARRL=F_PWM_SET%256; //配置自动重装载寄存器低位“ARRL”
                        TIM1_CR1&=0x8F;

                        CH1_PWM_SET(F_PWM_SET,PWM_abc[0]);//配置通道1输出信号占空比20%


                        TIM1_CR1|=0x01;//使能TIM1计数器功能“CEN=1”
                        TIM1_BKR=0x80;//打开“主输出”开关输出PWM信号“MOE=1”

                        break;

            case 2:    TIM1_ARRH=F_PWM_SET/256; //配置自动重装载寄存器高位“ARRH”
                        TIM1_ARRL=F_PWM_SET%256; //配置自动重装载寄存器低位“ARRL”
                        TIM1_CR1&=0x8F;

                         CH1_PWM_SET(F_PWM_SET,PWM_abc[1]);//配置通道2输出信号占空比40%


                         TIM1_CR1|=0x01;//使能TIM1计数器功能“CEN=1”
                         TIM1_BKR=0x80;//打开“主输出”开关输出PWM信号“MOE=1”

                         break;


            case 3:      TIM1_ARRH=F_PWM_SET/256; //配置自动重装载寄存器高位“ARRH”
                         TIM1_ARRL=F_PWM_SET%256; //配置自动重装载寄存器低位“ARRL”
                         TIM1_CR1&=0x8F;

                         CH1_PWM_SET(F_PWM_SET,PWM_abc[2]);//配置通道2输出信号占空比40%
                         //CH2_PWM_SET(F_PWM_SET,0);//配置通道1输出信号占空比20%
                         //CH3_PWM_SET(F_PWM_SET,0);//配置通道1输出信号占空比20%

                         TIM1_CR1|=0x01;//使能TIM1计数器功能“CEN=1”
                         TIM1_BKR=0x80;//打开“主输出”开关输出PWM信号“MOE=1”

                         num=0;
                         break;


            default:   break;

            }
          }

        }


}
/****************************************************************/
//TIM1_CH1通道PWM信号输出配置函数CH1_PWM_SET(),有形参F_SET_CH1、
//Duty_CH1,F_SET_CH1用于配置捕获/比较寄存器1高低位,Duty_CH1用于
//配置PWM信号占空比,无返回值
/****************************************************************/
void CH1_PWM_SET(unsigned long F_SET_CH1,float Duty_CH1)
{
  float a;//变量用于占空比计算
  a=Duty_CH1*F_SET_CH1;//计算占空比参数
  TIM1_CCR1H=((u16)(a))/256;//配置捕获/比较寄存器1高位“CCR1H”
  TIM1_CCR1L=((u16)(a))%256;//配置捕获/比较寄存器1低位“CCR1L”
  TIM1_CCMR1=0x60;//配置为PWM模式1
  TIM1_CCER1&=0xFD;//配置CC1P=0,OC1信号高电平有效
  TIM1_CCER1|=0x01;//配置CC1E=1,使能OC1输出
  TIM1_OISR|=0x01;//空闲状态时OC1为高电平
}
/****************************************************************/
//TIM1_CH2通道PWM信号输出配置函数CH2_PWM_SET(),有形参F_SET_CH2、
//Duty_CH2,F_SET_CH2用于配置捕获/比较寄存器2高低位,Duty_CH2用于
//配置PWM信号占空比,无返回值
/****************************************************************/
void CH2_PWM_SET(unsigned long F_SET_CH2,float Duty_CH2)
{
  float b;//变量用于占空比计算
  b=Duty_CH2*F_SET_CH2;//计算占空比参数
  TIM1_CCR2H=((u16)(b))/256;//配置捕获/比较寄存器2高位“CCR2H”
  TIM1_CCR2L=((u16)(b))%256;//配置捕获/比较寄存器2低位“CCR2L”
  TIM1_CCMR2=0x60;//配置为PWM模式1
  TIM1_CCER1&=0xDF;//配置CC2P=0,OC2信号高电平有效
  TIM1_CCER1|=0x10;//配置CC2E=1,使能OC2输出
  TIM1_OISR|=0x04;//空闲状态时OC2为高电平
}
/****************************************************************/
//TIM1_CH3通道PWM信号输出配置函数CH3_PWM_SET(),有形参F_SET_CH3、
//Duty_CH3,F_SET_CH3用于配置捕获/比较寄存器3高低位,Duty_CH3用于
//配置PWM信号占空比,无返回值
/****************************************************************/
void CH3_PWM_SET(unsigned long F_SET_CH3,float Duty_CH3)
{
  float c;//变量用于占空比计算
  c=Duty_CH3*F_SET_CH3;//计算占空比参数
  TIM1_CCR3H=((u16)(c))/256;//配置捕获/比较寄存器3高位“CCR3H”
  TIM1_CCR3L=((u16)(c))%256;//配置捕获/比较寄存器3低位“CCR3L”
  TIM1_CCMR3=0x60;//配置为PWM模式1
  TIM1_CCER2&=0x3D;//配置CC3P=0,OC3信号高电平有效
  TIM1_CCER2|=0x01;//配置CC3E=1,使能OC3输出
  TIM1_OISR|=0x10;//空闲状态时OC3为高电平
}
/****************************************************************/
//TIM1_CH4通道PWM信号输出配置函数CH4_PWM_SET(),有形参F_SET_CH4、
//Duty_CH4,F_SET_CH4用于配置捕获/比较寄存器4高低位,Duty_CH4用于
//配置PWM信号占空比,无返回值
/****************************************************************/
void CH4_PWM_SET(unsigned long F_SET_CH4,float Duty_CH4)
{
  float d;//变量用于占空比计算
  d=Duty_CH4*F_SET_CH4;//计算占空比参数
  TIM1_CCR4H=((u16)(d))/256;//配置捕获/比较寄存器4高位“CCR4H”
  TIM1_CCR4L=((u16)(d))%256;//配置捕获/比较寄存器4低位“CCR4L”
  TIM1_CCMR4=0x60;//配置为PWM模式1
  TIM1_CCER2&=0x1F;//配置CC4P=0,OC4信号高电平有效
  TIM1_CCER2|=0x10;//配置CC4E=1,使能OC4输出
  TIM1_OISR|=0x40;//空闲状态时OC4为高电平
}

void GPIO_init(void)
{
  PI_DDR_DDR0=0;//配置PI2端口为输入模式
  PI_CR1_C10=1;//配置PI2端口为带上拉的输入模式
  PI_CR2_C20=0;//配置PI2端口外中断禁止

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表