单片机-如何通过调节电位器,控制pwm占空比

问题描述

如何通过调节电位器,控制pwm占空比

初学stm8单片机,用stm8s003F 编写的一个小程序
1、 RT1是色温调节3200K/5600K转换电位器外接PD5的AD口
2、 RT2是亮度调节电位器外接PD6的AD口
3、PC6、PC7是PWM输出32khz的频率,根据检测到PD5/PD6的电压调节占空比,达到调光的效果
下面是我的功能代码,不知哪里有误,一直输不出pwm,麻烦各位大神帮忙看看。

void Init_ADC_GPIO(void)
{
GPIO_Init(GPIOD, GPIO_PIN_5, GPIO_MODE_IN_FL_NO_IT);//PD5
GPIO_Init(GPIOD, GPIO_PIN_6, GPIO_MODE_IN_FL_NO_IT);//PD6
GPIO_Init(GPIOC, GPIO_PIN_6, GPIO_MODE_OUT_PP_LOW_SLOW); //PC6低速推挽输出高电平
GPIO_Init(GPIOC, GPIO_PIN_7, GPIO_MODE_OUT_PP_LOW_SLOW);//PC7低速推挽输出高电平
}
void ADC_Init(void)
{
Init_ADC_GPIO();
ADC1_DeInit();
ADC1->CSR = 0x05; //seclect AIN5 (PD5) as channel to be converted
ADC1->CR1 = 0x40; //Fadc = Fmaster/8 = 2MHz
ADC1->CR2 = 0x08; //Right alignement*/
ADC1->CSR = 0x06; //seclect AIN6 (PD6) as channel to be converted
ADC1->CR1 = 0x40; //Fadc = Fmaster/8 = 2MHz
ADC1->CR2 = 0x08; //Right alignement*/
/*开启ADC1控制器*/
ADC1_Cmd(ENABLE);
/*开始进行ADC1模数转换*/
ADC1_StartConversion();

}
void TIM_Init(void)
{
TIM1_DeInit(); //定时器1复位
TIM1_TimeBaseInit(16, TIM1_COUNTERMODE_UP, 1000, 0);//定时器1时基初始化
/* Channel 5 PWM configuration /
TIM1_OC1Init(TIM1_OCMODE_PWM1,TIM1_OUTPUTSTATE_ENABLE,TIM1_OUTPUTNSTATE_DISABLE, u16_adc1_value,TIM1_OCPOLARITY_LOW,TIM1_OCNPOLARITY_LOW,TIM1_OCIDLESTATE_RESET, TIM1_OCNIDLESTATE_RESET);
TIM1_OC1PreloadConfig(ENABLE);
/
Channel 6 PWM configuration */
TIM1_OC2Init(TIM1_OCMODE_PWM1,TIM1_OUTPUTSTATE_ENABLE,TIM1_OUTPUTNSTATE_DISABLE, u16_adc2_value,TIM1_OCPOLARITY_LOW,TIM1_OCNPOLARITY_LOW,TIM1_OCIDLESTATE_RESET, TIM1_OCNIDLESTATE_RESET);

TIM1_OC2PreloadConfig(ENABLE);
TIM1_PrescalerConfig(1, TIM1_PSCRELOADMODE_UPDATE);
TIM1->ARRH=0; //初始化自动装载寄存器,决定PWM方波的频率
TIM1->ARRL=256; //初始化自动装载寄存器,决定PWM方波的频率
/* Enables TIM1 peripheral Preload register on ARR */
TIM1_ARRPreloadConfig(ENABLE); //自动加载使能
TIM1_Cmd(ENABLE);
}

uint16_t get_adc(void)
{
int j=0;
ADC1_Cmd(ENABLE); //ADC1->CR1 |= 0x01;//ADC使能
for ( j = 40;j > 0;j--);//等待7us
ADC1_StartConversion(); //ADC1->CR1 |= 0x01; //开始转换
while (!(ADC1->CSR & 0x80)); //等待转换结束
ADC1->CSR &= ~0x80; //清除转换结束标志
u16_adc1_value =((((unsigned int)ADC1->DRH)<DRL);// 结果送入u16_adc1_value缓冲区
TIM1->CCR1H =0x00;
TIM1->CCR1L =(unsigned char)(u16_adc1_value>>2);
u16_adc2_value =((((unsigned int)ADC1->DRH)<DRL);// 结果送入AD_Value缓冲区
TIM1->CCR2H =0x00;
TIM1->CCR2L =(unsigned char)(u16_adc2_value>>2);//结果由PD7口送出至LED
ADC1_ClearITPendingBit((ADC1_IT_TypeDef)ADC1_IT_EOC); //清楚转换标志
return u16_adc1_value,u16_adc2_value;
}
void CLK_init(void)/*时钟初始化,2分频*/
{
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV2);
}
void main(void)
{
uint16_t chanel; //通道
int i=0;
TIM_Init();
ADC_Init();
Init_ADC_GPIO();
while(1)
{
get_adc();

if(channel==ADC1_CHANNEL_5)
{
// 下面的循环将占空比逐渐从0递增到50%
for(i=0;i<128;i++)
{ 

 //PC6输出占空比

TIM1->CCR1H = 0;
TIM1->CCR1L = i;
DelayMs(5);
}
// 下面的循环将占空比逐渐从50%递减到0
for(i=128;i>0;i--)
{
//PC7输出占空比

TIM1->CCR1H = 0;
TIM1->CCR1L = i;
DelayMs(5); 

}

}
if(channel==ADC1_CHANNEL_5)
{

// 下面的循环将占空比逐渐从0%递减到50
for(i=0;i
{
//PC7输出占空比
TIM1->CCR2H = 0;
TIM1->CCR2L = i;
DelayMs(5);
}
// 下面的循环将占空比逐渐从50%递减到0
for(i=128;i>0;i--)
{
//PC6输出占空比
TIM1->CCR2H = 0;
TIM1->CCR2L = i;
DelayMs(5);
}
}
}
}

解决方案

我只用过stm32的arm,但是据我观察,你的tim1配置了pwm,但是你使能了pwm输出吗?或者io配置成输出模式了吗?

时间: 2024-08-01 21:01:02

单片机-如何通过调节电位器,控制pwm占空比的相关文章

数据-PIC单片机I/O口输入信号控制APF开关机,新手,求大神解答

问题描述 PIC单片机I/O口输入信号控制APF开关机,新手,求大神解答 dsp,pic,display搭建的数据传输环境,原本使用显示屏的开关机按键控制APF设备的开机.关机(ON_KEY),现在想要让PIC单片机I/O口输入信号也能控制APF开关机,下面的程序是设置RD12口选择位,选择是按键控制还是输入信号RD1RD2控制,之前我把(DI4为1时选择DI控制,且RD1=1时开机,RD2=1时关机),结果不给DI口信号的话程序运行会直接开机.改成下面这样就不受影响了,这是为什么?还有就是这样

c8051f410-通过超声测得的距离控制PWM输出的代码,不知道哪里错了,求大神帮忙看看

问题描述 通过超声测得的距离控制PWM输出的代码,不知道哪里错了,求大神帮忙看看 #include #define SYSCLK 24500000 // Internal oscillator frequency in Hz #define BAUDRATE 9600 // Baud rate of UART in bps #define uchar unsigned char #define uint unsigned int //L298输入控制端定义 sbit IN1 = P2^0; sb

如下,STM32F103RCT6怎么产生15.6K占空比可调的PWM

问题描述 如下,STM32F103RCT6怎么产生15.6K占空比可调的PWM 现在硬件已经确定 引脚A8,A9,A10 功能有TIM1 CH 1,2,3 左电机A,B,C三相 0时关断 1时导通 上MOSFET接VIN 引脚B13,B14,B15 功能有TIM1 CH 1 N,2 N,3 N 左电机A,B,C三相 1时关断 0时导通 下MOSFET接GND 引脚C6,C7,C8 功能无 重定义功能TIM3 CH 1,2,3 右电机A,B,C三相 0时关断 1时导通 上MOSFET接VIN 引脚

基于ARM-contexA9-蜂鸣器pwm驱动开发

上次,我们写过一个蜂鸣器叫的程序,但是那个程序仅仅只是驱动蜂鸣器,用电平1和0来驱动而已,跟驱动LED其实没什么两样.我们先来回顾一下蜂鸣器的硬件还有相关的寄存器吧: 还是和以前一样的步骤: 1.看电路图      (1)蜂鸣器接口位于电路板的底板,看电路图可知道是高电平有效.        (2)相对应的找到核心板的接口.由此可知,我们的蜂鸣器是GPD0_0   接下来找数据手册,找到对应的寄存器,然后配置它就可以了.   2.查数据手册,找到相关的寄存器,并配置 (1)找到GPD0CON,地

如何来看单片机外设A/D转换器ADC0804时序图

如图,为单片机AD转换器的一种: ADC0804单片集成A/D转换器.它采用CMOS工艺20引脚集成芯片,分辩率为8位,转换时间为100µs,输入电压范围为0-5V.芯片内具有三态输出数据锁存器,可直接接在数据总线上. 各引脚名称及作用如下: VIN(+),VIN(-)--两模拟信号输入端,用以接收单极性.双极性和差模输入信号. DB7-DB0--具有三态特性数字信号输出口. AGND--模拟信号地. DGND--数字信号地. CLK--时钟信号输入端. CLKR--内部时钟发生器的外接电阻端,

怎么调节风扇转速?

  CPU风扇的转速在系统里面可以用第三方软件来看,如aida64查看,关于可控速的CPU风扇必须是4pin线缆的CPU风扇,市面上很多CPU风扇是 3pin的是不支持转速控制的.原装风扇都是4pin的,这种风扇是可以根据BIOS的控制来调节风扇的转速的,当风扇的转速很高的时候,通常达到 4000转以上的时候就会发较大的噪音. 一.cpu风扇转速调节的方法:用软件调节 我们来介绍一下怎么用SpeedFan来控制CPU风扇转速,这款SpeedFan软件比较好用,比较难得的是这款SpeedFan是中

《51单片机应用开发范例大全(第3版)》——1.2 Keil Vision2

1.2 Keil Vision2 MCS-51单片机的开发除了需要硬件的支持以外,同样离不开软件.CPU真正可执行的是机器码,用汇编语言或C等高级语言编写的源程序必须转换为机器码才能运行,转换的方法有手工汇编和机器汇编两种,前者目前已极少使用.机器汇编是指通过汇编软件将源程序变为机器码的编译方法.这种汇编软件称为编译器.本节将向大家介绍目前十分流行的Keil Vision2. 1.2.1 Keil Vision2集成开发环境介绍 Keil Vision2是一个集成开发环境(Intergrated

zigbee cc2530-怎么在ZStack 协议栈里使用PWM?

问题描述 怎么在ZStack 协议栈里使用PWM? 怎么在ZStack 协议栈里使用PWM?就是两个cc2530模块通信,一个模块通过按键控制PWM输出来调节灯的亮度,一个模块接pt4115驱动电路.刚开始接触Zigbee,什么都不懂..详细一点 谢谢!

stm32之PWM

PWM是pulse width modulation的缩写,即脉冲宽度调制.其通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形: 1.PWM是一种对模拟信号电平进行数字编码的方法.通过高分辨率计数器的使用,方波的占空比被调制,用来对一个具体模拟信号的电平进行编码.等效的实现是基于采样定理中的一个重要结论:冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同.冲量即指窄脉冲的面接.这里所说的效果基本相同,是指该环节的输出响应波形基本相同. 2.如把各输出波形用傅立叶分析,则它们的