OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9594|回复: 16

STM32 红外发射Timer1 ch1 PWM输出

[复制链接]

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2013-11-7
在线时间
0 小时
发表于 2013-11-7 15:35:56 | 显示全部楼层 |阅读模式
之前做红外发射,在网上都找不到现成的资料,现在自己做出来了,拿出来给有需要的人


void Timer1_PWM_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
    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);
    //TIM1基本计数器设置(设置PWM频率)
    //频率=TIM1_CLK/(ARR+1)
    TIM_BaseInitStructure.TIM_Period = 1894;            //不分频。PWM频率=72000/1894=38Khz
    TIM_BaseInitStructure.TIM_Prescaler = 0;
    TIM_BaseInitStructure.TIM_ClockDivision = 0;
    TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_BaseInitStructure.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM1, &TIM_BaseInitStructure);
    //启用ARR的影子寄存器(直到产生更新事件才更改设置)
    TIM_ARRPreloadConfig(TIM1, ENABLE);
 //TIM1_OC1模块设置(设置1通道占空比)
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OC1Init(TIM1, &TIM_OCInitStructure);
    //启用CCR1寄存器的影子寄存器(直到产生更新事件才更改设置)
    TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
    TIM_Cmd(TIM1, ENABLE);                //TIM1开启
    //TIM1_OC通道输出PWM(一定要加)
    TIM_CtrlPWMOutputs(TIM1, ENABLE);
    TIM_SetCompare1(TIM1,625);         //设置占空比为1/3
}

下面是简单的发送
void IR_Send(void)
{
    //9ms
    TIM_Cmd(TIM1, ENABLE);
    Delay_nMS(9);
    //4.5ms
    TIM_Cmd(TIM1, DISABLE);
    Delay_nMS(4);
    Delay_nUS(500);
    //0
    TIM_Cmd(TIM1, ENABLE);
    Delay_nUS(565);
    TIM_Cmd(TIM1, DISABLE);
    Delay_nUS(565);
    //0
    TIM_Cmd(TIM1, ENABLE);
    Delay_nUS(565);
    TIM_Cmd(TIM1, DISABLE);
    Delay_nUS(565);

    //0
    TIM_Cmd(TIM1, ENABLE);
    Delay_nUS(565);
    TIM_Cmd(TIM1, DISABLE);
    Delay_nUS(565);
    //0
    TIM_Cmd(TIM1, ENABLE);
    Delay_nUS(565);
    TIM_Cmd(TIM1, DISABLE);
    Delay_nUS(565);

    //0
    TIM_Cmd(TIM1, ENABLE);
    Delay_nUS(565);
    TIM_Cmd(TIM1, DISABLE);
    Delay_nUS(565);
    //0
    TIM_Cmd(TIM1, ENABLE);
    Delay_nUS(565);
    TIM_Cmd(TIM1, DISABLE);
    Delay_nUS(565);

    //0
    TIM_Cmd(TIM1, ENABLE);
    Delay_nUS(565);
    TIM_Cmd(TIM1, DISABLE);
    Delay_nUS(565);
    //0
    TIM_Cmd(TIM1, ENABLE);
    Delay_nUS(565);
    TIM_Cmd(TIM1, DISABLE);
    Delay_nUS(565);

    //0
    TIM_Cmd(TIM1, ENABLE);
    Delay_nUS(565);
    TIM_Cmd(TIM1, DISABLE);
    Delay_nUS(565);
    //0
    TIM_Cmd(TIM1, ENABLE);
    Delay_nUS(565);
    TIM_Cmd(TIM1, DISABLE);
    Delay_nUS(565);

    //0
    TIM_Cmd(TIM1, ENABLE);
    Delay_nUS(565);
    TIM_Cmd(TIM1, DISABLE);
    Delay_nUS(565);
    //0
    TIM_Cmd(TIM1, ENABLE);
    Delay_nUS(565);
    TIM_Cmd(TIM1, DISABLE);
    Delay_nUS(565);

    //0
    TIM_Cmd(TIM1, ENABLE);
    Delay_nUS(565);
    TIM_Cmd(TIM1, DISABLE);
    Delay_nUS(565);
    //0
    TIM_Cmd(TIM1, ENABLE);
    Delay_nUS(565);
    TIM_Cmd(TIM1, DISABLE);
    Delay_nUS(565);

    //0
    TIM_Cmd(TIM1, ENABLE);
    Delay_nUS(565);
    TIM_Cmd(TIM1, DISABLE);
    Delay_nUS(565);
    //0
    TIM_Cmd(TIM1, ENABLE);
    Delay_nUS(565);
    TIM_Cmd(TIM1, DISABLE);
    Delay_nUS(565);

    //0
    TIM_Cmd(TIM1, ENABLE);
    Delay_nUS(565);
    TIM_Cmd(TIM1, DISABLE);
    Delay_nUS(565);
    //0
    TIM_Cmd(TIM1, ENABLE);
    Delay_nUS(565);
    TIM_Cmd(TIM1, DISABLE);
    Delay_nUS(565);

    //0
    TIM_Cmd(TIM1, ENABLE);
    Delay_nUS(565);
    TIM_Cmd(TIM1, DISABLE);
    Delay_nUS(565);
    //0
    TIM_Cmd(TIM1, ENABLE);
    Delay_nUS(565);
    TIM_Cmd(TIM1, DISABLE);
    Delay_nUS(565);

    //0
    TIM_Cmd(TIM1, ENABLE);
    Delay_nUS(565);
    TIM_Cmd(TIM1, DISABLE);
    Delay_nUS(565);
    //0
    TIM_Cmd(TIM1, ENABLE);
    Delay_nUS(565);
    TIM_Cmd(TIM1, DISABLE);
    Delay_nUS(565);

    //0
    TIM_Cmd(TIM1, ENABLE);
    Delay_nUS(565);
    TIM_Cmd(TIM1, DISABLE);
    Delay_nUS(565);
    //0
    TIM_Cmd(TIM1, ENABLE);
    Delay_nUS(565);
    TIM_Cmd(TIM1, DISABLE);
    Delay_nUS(565);

    //0
    TIM_Cmd(TIM1, ENABLE);
    Delay_nUS(565);
    TIM_Cmd(TIM1, DISABLE);
    Delay_nUS(565);
    //0
    TIM_Cmd(TIM1, ENABLE);
    Delay_nUS(565);
    TIM_Cmd(TIM1, DISABLE);
    Delay_nUS(565);

    //0
    TIM_Cmd(TIM1, ENABLE);
    Delay_nUS(565);
    TIM_Cmd(TIM1, DISABLE);
    Delay_nUS(565);
    //0
    TIM_Cmd(TIM1, ENABLE);
    Delay_nUS(565);
    TIM_Cmd(TIM1, DISABLE);
    Delay_nUS(565);

    //0
    TIM_Cmd(TIM1, ENABLE);
    Delay_nUS(565);
    TIM_Cmd(TIM1, DISABLE);
    Delay_nUS(565);
    //0
    TIM_Cmd(TIM1, ENABLE);
    Delay_nUS(565);
    TIM_Cmd(TIM1, DISABLE);
    Delay_nUS(565);

    //0
    TIM_Cmd(TIM1, ENABLE);
    Delay_nUS(565);
    TIM_Cmd(TIM1, DISABLE);
    Delay_nUS(565);
    //0
    TIM_Cmd(TIM1, ENABLE);
    Delay_nUS(565);
    TIM_Cmd(TIM1, DISABLE);
    Delay_nUS(565);

    TIM_Cmd(TIM1, ENABLE);
    Delay_nUS(565);
    Delay_nUS(565);
    Delay_nUS(565);
    TIM_Cmd(TIM1, DISABLE);
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2013-11-7
在线时间
0 小时
 楼主| 发表于 2013-11-8 10:04:15 | 显示全部楼层
上面的代码是当时测试用的,下面的做了些改进

void Timer1_PWM_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
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);
    //TIM1基本计数器设置(设置PWM频率)
    //频率=TIM1_CLK/(ARR+1)
    TIM_BaseInitStructure.TIM_Period = 1894; //不分频。PWM频率=72000/1894=380Khz
    TIM_BaseInitStructure.TIM_Prescaler = 0;
    TIM_BaseInitStructure.TIM_ClockDivision = 0;
    TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_BaseInitStructure.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM1, &TIM_BaseInitStructure);
    //启用ARR的影子寄存器(直到产生更新事件才更改设置)
    TIM_ARRPreloadConfig(TIM1, ENABLE);
 //TIM1_OC1模块设置(设置1通道占空比)
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OC1Init(TIM1, &TIM_OCInitStructure);
    //启用CCR1寄存器的影子寄存器(直到产生更新事件才更改设置)
    TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
    TIM_Cmd(TIM1, ENABLE); //TIM1开启
    //TIM1_OC通道输出PWM(一定要加)
    TIM_CtrlPWMOutputs(TIM1, ENABLE);
}

void IR_Send(void)
{
//9ms
TIM_Cmd(TIM1, ENABLE);
Delay_nMS(9);
//4.5ms
TIM_Cmd(TIM1, DISABLE);
Delay_nMS(4);
Delay_nUS(500);
IR_Send_Byte(0x00); //用户码
IR_Send_Byte(0xFF); //用户反码
IR_Send_Byte(0x00); //数据码
IR_Send_Byte(0xFF); //数据反码
//下面增加是为了避免在发送最后一位时出现错码
TIM_Cmd(TIM1, ENABLE);
Delay_nUS(565);
TIM_Cmd(TIM1, DISABLE);
Delay_nUS(565);
}

void IR_Send_Byte(u8 getdata)
{
u8 senddata,i;
senddata=getdata;
for(i=0;i<8;i++)
{
if(senddata&0x01)
{
//1
TIM_Cmd(TIM1, ENABLE);
Delay_nUS(565);
TIM_Cmd(TIM1, DISABLE);
Delay_nUS(565);
Delay_nUS(565);
Delay_nUS(565);
}
else
{
//0
TIM_Cmd(TIM1, ENABLE);
Delay_nUS(565);
TIM_Cmd(TIM1, DISABLE);
Delay_nUS(565);
}
senddata=senddata>>1;
}
}
回复 支持 1 反对 0

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2013-11-20
在线时间
2 小时
发表于 2013-12-11 15:28:49 | 显示全部楼层
LZ  :小弟才学习stm32,能不能贴个完整的工程代码呀。
Delay_nUS函数,和delay_us函数有什么区别?
回复 支持 1 反对 0

使用道具 举报

38

主题

2061

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
发表于 2013-11-7 18:32:07 | 显示全部楼层
谢谢分享,代码感觉有点臃肿哦,能不能简化些呢
站在巨人的肩膀上不断的前进。。。
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2013-11-7
在线时间
0 小时
 楼主| 发表于 2013-11-8 09:48:15 | 显示全部楼层
回复【2楼】xiaoyan:
---------------------------------
行,再改改
回复 支持 反对

使用道具 举报

38

主题

2061

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
发表于 2013-11-8 10:06:04 | 显示全部楼层
回复【4楼】特工_500:
---------------------------------
不错,现在看起来简洁多啦^_^
站在巨人的肩膀上不断的前进。。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-11-8 10:14:41 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

2

主题

15

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2014-2-9
在线时间
1 小时
发表于 2014-2-9 15:02:22 | 显示全部楼层
dfffddf
回复 支持 反对

使用道具 举报

2

主题

15

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2014-2-9
在线时间
1 小时
发表于 2014-2-9 15:03:03 | 显示全部楼层
你好,我按照你的程序写了之后,波形出来了,很工整,但无法控制空调,请问是为什么.
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2013-11-7
在线时间
0 小时
 楼主| 发表于 2014-7-4 10:20:51 | 显示全部楼层
回复【9楼】wenwubie:
---------------------------------
你看下会不会是发射管的问题,因为普通的红外接收头都是处理反向的数据,就是说你在发射的时候,要把发射头也反向
回复 支持 反对

使用道具 举报

sliverg 该用户已被删除
发表于 2017-5-11 17:34:16 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

5

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2016-7-28
在线时间
41 小时
发表于 2017-11-30 17:29:37 | 显示全部楼层
学习了
回复 支持 反对

使用道具 举报

0

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2018-3-21
在线时间
45 小时
发表于 2018-10-15 13:46:36 | 显示全部楼层
MARK,感谢分享
回复 支持 反对

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2018-10-24
在线时间
12 小时
发表于 2018-11-15 10:46:45 | 显示全部楼层
谢谢楼主
回复 支持 反对

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2014-10-24
在线时间
24 小时
发表于 2019-8-14 17:08:03 | 显示全部楼层
楼主能不能上传个完成的程序代码给学习学习
回复 支持 反对

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2014-10-24
在线时间
24 小时
发表于 2019-8-24 18:11:01 | 显示全部楼层
楼主 有没有碰见 发射的波形 非载波段的电平时高时低
回复 支持 反对

使用道具 举报

4

主题

14

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2019-8-8
在线时间
9 小时
发表于 2019-9-9 10:19:28 | 显示全部楼层
楼主,小弟现在刚好在做这个红外发射,,不知道大哥能不能提供一下源程序和外接红外发射的电路图,万分感谢啊,我已经为这个难题烦恼了很久了
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 19:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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