my_angle2016 2016-03-31 03:48 采纳率: 0%
浏览 6261

如何通过调节电位器,控制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);
}
}
}
}

  • 写回答

1条回答

  • zl199203 2016-04-12 12:56
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥50 树莓派安卓APK系统签名
  • ¥15 maple软件,用solve求反函数出现rootof,怎么办?
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥15 state显示变量是字符串形式,但是仍然红色,无法引用,并显示类型不匹配
  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题
  • ¥20 在虚拟机的pycharm上
  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波