Atmega32 ADC Value not accurate
If ADLAR = 1, then according to the datasheet, (section 26.8.4, see attachment), the ADC result is left aligned to the 16-bit couple ADCH-ADCL.

Your function adc_read() returns a 8-bit integer. Therefore it returns only the ADCL (see figure), because the upper 8 bits are lost in the conversion uint_16->uint_8.

In other words, if A0 or A1 are 1, you'll get a large duty value, because the value returned by adc_read() will be between 0x40 and 0xC0.

Solution: in your function adc_read() return ADCH only.

Also the potentiometer must be connected to a voltage source with AREF volt, where AREF is the ADC reference voltage. If you are using the internal reference, do not connect the potentiometer directly to the AREF pin, because such pin has a very small output current capability.