打印
[应用相关]

【转】STM8 STVD TIM1 输出2路 占空比可调脉冲信号

[复制链接]
799|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Lewisnx|  楼主 | 2018-6-27 22:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

/****
本例子简单 就是利用TIM1输出比较功能  “输出”来输出占空比可调的 信号,可以输出占空比可调的PWM 波
注意是 串口的 波特率  和输出信号 怎么计算

*/
/* MAIN.C file
*
* Copyright (c) 2002-2005 STMicroelectronics
*/
#include "stm8s105c4.h"
#include "stdio.h"
#include "stm8s.h"


/****************************************/
#define UNIQUE_ID_START_ADDR 0X48CD

unsigned char i;
int temp;
char t;

unsigned char  *pid;

//此部分是测试单片机 唯一ID 使用 与测试IO 频率占空比没有钉钉关系
//如果注释掉 TIM1 部分代码是没有关系的 串口就会输出 ID 值
/********************************************/

//TIM1 控制整流电机 转速
//PC1 输出占空比75%的PWM
//PC2 输出占空比50%的PWM

_Bool in1 @PB_ODR:3;
_Bool in2 @PB_ODR:4;
_Bool in3 @PB_ODR:5;
_Bool in4 @PB_ODR:6;

void delay(unsigned int t)
{
                while(t--);
}
void tim1_oc1_init(void)
{   //2000.000/X = 16000 X=125HZ  
                TIM1_ARRH = 0X3E;
                TIM1_ARRL = 0X80;
                //占空比计算  12000/16000 = 75%
                TIM1_CCR1H = 0X2E;
                TIM1_CCR1L = 0X30;
                //模式选择
                //通道配置输出
                //110 PWM模式1  向上计数
                TIM1_CCMR1 = 0X60;
                //
                TIM1_CCER1 = 0X01;
                //
                TIM1_OISR = 0X01;
               
}

void tim1_oc2_init(void)
{   //2000.000/X = 8000 X=250HZ  
                TIM1_ARRH = 0X1F;
                TIM1_ARRL = 0X40;
                //占空比计算  8000/16000 = 50%
                TIM1_CCR1H = 0X2E;
                TIM1_CCR1L = 0X30;
                //模式选择
                //通道配置输出
                //110 PWM模式1  向上计数
                TIM1_CCMR1 = 0X60;
                //
                TIM1_CCER1 = 0X11;
                //
                TIM1_CR1 = 0X01;
               
                TIM1_OISR = 0X01;
                //
                TIM1_BKR = 0X80;
               
}




void uart2_init(void)
{
                UART2_CR1 = 0X00;
                //控制寄存器 1
                //R8存放接收到的字第9位
                //T8 存放发送字的第9位
                //UARTD=0 使能
                //WAIE 被空闲总线唤醒
                //PCEN UART 模式=0 奇偶校验 禁止
                //PS 奇偶校验选择 这里不选择
                //PIEN 校验中断 = 0 禁止
                UART2_CR2 = 0X0C;//0000 1100
                //发送接收使能
                UART2_CR3 = 0X20; //0010
                //00 1个停止位
                //01 保留
                //10 2个停止位
                // 11 1.5 个停止位
                UART2_BRR2 = 0X00; //2MHZ 下9600
                UART2_BRR1 = 0X0D; //2000000/9600 = 208 =D0 =00D0
                //设置波特率
                //这个波特率设置很有意思
                //不是直接赋值 而是 达到的 16进制数
                // 中间两位赋值 给BRR1 两边2为赋值给BRR2
               
}


char putchar(char c)
{
                UART2_DR = c;
                while(!(UART2_SR & 0X80));
                return c;
               
}

char getchar(void)
{
                char c;
                while(!(UART2_SR & 0X20));
                return (UART2_DR);
}


void gpio_init(void)
{
  PE_ODR = 0XFF;
        PE_DDR = 0XFF;
        PE_CR1 = 0XFF;
        PE_CR2 = 0X00;
}






main()
{
  //gpio_init();
        uart2_init();  //串口2 初始化  
  printf("系统初始化完成 !\r\n");
  //printf("芯片96位唯一ID为:\r\n");        
        //pid = (unsigned char *)UNIQUE_ID_START_ADDR;
        /**********************************
        for(i=0;i<12;i++)
        {
                        temp = (int)*(pid++);
                        printf("0x%0.2x\r\n",temp);
        }
        **********************************/
        tim1_oc2_init();
        tim1_oc2_init();
        while (1)
        {
                        /**************************************
                        printf("输入:(a,LED亮 b,LED灭)\r\n");
                        t = getchar();
                        switch(t)
            {
                                        case 'a': printf("LED 亮\r\n");
                                        PE_ODR = 0X00;
                                        break;
                                        case 'b': printf("LED 灭\r\n");
                                        PE_ODR = 0B00110011;
                                        break;
                                        default:
                                        printf("输入错误!\r\n");
                                        break;
                        }
                        *****************************************/
                        
                        ;
                        
                        
        }
        
}
沙发
mmuuss586| | 2018-7-25 10:29 | 只看该作者
感谢分享;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

45

主题

380

帖子

0

粉丝